``` interface LockableHolder { val isLocked: B...
# getting-started
k
Copy code
interface LockableHolder {
    val isLocked: Boolean
}

fun <T> LockableHolder.delegate(t: T) = LockableDelegate(this, t)

class LockableDelegate<out T>(
        private val holder: LockableHolder,
        private val t: T
) : ReadOnlyProperty<LockableHolder, T> {
    override fun getValue(thisRef: LockableHolder, property: KProperty<*>): T {
        if (holder.isLocked) throw IllegalStateException("Already locked")

        return t
    }
}

class Connection : LockableHolder {
    override var isLocked: Boolean = false
        private set
    
    val string by delegate("foo")
    val int by delegate(42)

    fun lock() {
        isLocked = true
    }
}