yoavst
11/10/2017, 10:19 AMclass 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 })
}