package me.eternal.purrfect.core.wrapper.impl.valdi import me.eternal.purrfect.core.util.ktx.getObjectField import me.eternal.purrfect.core.wrapper.AbstractWrapper import java.lang.ref.WeakReference import java.lang.reflect.Proxy class ValdiContext(obj: Any): AbstractWrapper(obj) { val componentPath by field("componentPath") val viewModel by field("innerViewModel") val moduleName by field("moduleName") val componentContext by field>("componentContext") val viewModelLegacy: Any? get() = runCatching { instanceNonNull().getObjectField("viewModel") }.getOrNull() ?: instanceNonNull()::class.java.methods.firstOrNull { it.name == "getViewModel" && it.parameterTypes.isEmpty() }?.invoke(instanceNonNull()) fun enqueueNextRenderCallback(callback: () -> Unit) { val method = instanceNonNull()::class.java.methods.firstOrNull { it.name == "onNextLayout" } method?.invoke(instanceNonNull(), Proxy.newProxyInstance( instanceNonNull()::class.java.classLoader, arrayOf(method.parameterTypes[0]) ) { _, _, _ -> callback() }) } }