// FILE: A.kt open class A(val x: T) // FILE: AFactory.kt abstract class AFactory { abstract fun create(): A? } // FILE: Util.kt inline fun createWith(x: T, f: (T) -> A?) = f(x) // FILE: B.kt class B(x: Int) : A(x) { companion object : AFactory() { override fun create(): A? = createWith(0, ::B) } }