``` class CacheProperty<K : Any>(private val...
# reflect
y
Copy code
class CacheProperty<K : Any>(private val getter: () -> K, private val setter: (K) -> Unit): ReadWriteProperty<Any?, K> {
    private var cache: K? = null
    override fun getValue(thisRef: Any?, property: KProperty<*>): K {
        if (cache == null) {
            cache = getter()
        }
        return cache!!
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: K) {
        cache = value
        setter(value)
    }
}

fun <K: Any> cache(getter: () -> K, setter: (K) -> Unit) = CacheProperty(getter, setter)

interface Source {
    var name: String
}
class SourceCaching(source: Source) : Source {
    override var name: String by cache(source::name, { source.name = it })
}