private class DefaultProperty internal constructor(private val default: () -> T) : ReadWriteProperty { private var inner: T? = null override fun getValue(thisRef: Any?, property: KProperty<*>): T = inner ?: default() override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { inner = value } } private inline fun defaultProperty(noinline default: () -> T): DefaultProperty = DefaultProperty(default) class Test { val foo: String? by defaultProperty { null } }