package foo trait Getter { fun get(): T } class Delegate(val getter: Getter) { var t: T? = null fun get(obj: Any, property: PropertyMetadata) : T { if (t != null) { return t!! } return getter.get() } fun set(obj: Any, property: PropertyMetadata, value: T) { t = value } } class A : Getter { var value = 0 override fun get(): Int { return value } val delegate = Delegate(this) val a by delegate var b by delegate } fun box(): String { val a = A() if (a.a != 0) return "a.a != 0" if (a.b != 0) return "a.b != 0" a.b = 4 if (a.a != 4) return "a.a != 4" if (a.b != 4) return "a.b != 4" return "OK" }