// has equals semantics so passing it to onChange() etc is idempotent srecord UpdateTrigger(Updateable target) is Runnable { run { target?.update(); } }