object GUI { val listeners = mutableMapOf Unit>() var connected by Delegates.observable(false) { prop, old, new -> listeners[prop.name]?.invoke(new) } @JsName("addListener") fun addListener(prop: dynamic, listener: (dynamic) -> Unit) { listeners[prop as String] = listener } @JsName("removeListener") fun removeListener(prop: dynamic) { listeners.remove(prop as String) } }