@MainThread inline fun components(): Lazy { return ComponentLazy(C::class) } class ComponentLazy ( private val componentClass: KClass ) : Lazy { private var cached: C? = null override val value: C get() { val match = ComponentRouter.components.values.find { it.javaClass.interfaces.contains(componentClass.java) } requireNotNull(match) { ComponentNotRegisteredException(componentClass::simpleName) } return (match as C).also { cached = it } } override fun isInitialized() = cached != null }