diff options
author | David Thompson <dthompson@vistahigherlearning.com> | 2021-03-16 17:11:43 -0400 |
---|---|---|
committer | David Thompson <dthompson@vistahigherlearning.com> | 2021-03-16 17:11:43 -0400 |
commit | d6d3bede2aed711d906d82c86ea5ddb410e41549 (patch) | |
tree | 8615e832e5c318192a78dd060f4f4b06aafef471 /starling/node.scm | |
parent | da469076e61e8d25e8af57a0d214cb3a664eee7d (diff) |
Add watchable slots to <meta-node> metaclass.
Diffstat (limited to 'starling/node.scm')
-rw-r--r-- | starling/node.scm | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/starling/node.scm b/starling/node.scm index 8e16c4f..578ce2c 100644 --- a/starling/node.scm +++ b/starling/node.scm @@ -36,6 +36,7 @@ visible? paused? for-each-child + on-change on-boot on-enter on-exit @@ -66,6 +67,9 @@ (define-method (asset-slot? (slot <slot>)) (get-keyword #:asset? (slot-definition-options slot))) +(define-method (watch-slot? (slot <slot>)) + (get-keyword #:watch? (slot-definition-options slot))) + (define-method (compute-getter-method (class <meta-node>) slot) (if (asset-slot? slot) (make <method> @@ -78,6 +82,21 @@ value))))) (next-method))) +(define-generic on-change) + +(define-method (compute-setter-method (class <meta-node>) slot) + (let ((method (next-method))) + (if (watch-slot? slot) + (let ((slot-name (slot-definition-name slot)) + (proc (method-procedure method))) + (make <method> + #:specializers (list class <top>) + #:procedure (lambda (obj new) + (let ((old (and (slot-bound? obj slot-name) + (slot-ref obj slot-name)))) + (proc obj new) + (on-change obj slot-name old new))))) + method))) (define-class <developer-meta-node> (<meta-node> <redefinable-class>)) |