fun verified(input : T, error : String, expression : (T) -> Boolean) = Verified(input, error, expression) class Verified(private var value : T, private val error : String, private val expression : (T) -> Boolean) : ReadWriteProperty { init { require(expression(value)) { error } } override fun getValue(thisRef : Any, property : KProperty<*>) : T = value override fun setValue(thisRef : Any, property : KProperty<*>, value : T) { require(expression(value)) { error } this.value = value } }