summaryrefslogtreecommitdiff
path: root/starling/node.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson@vistahigherlearning.com>2021-03-16 17:11:43 -0400
committerDavid Thompson <dthompson@vistahigherlearning.com>2021-03-16 17:11:43 -0400
commitd6d3bede2aed711d906d82c86ea5ddb410e41549 (patch)
tree8615e832e5c318192a78dd060f4f4b06aafef471 /starling/node.scm
parentda469076e61e8d25e8af57a0d214cb3a664eee7d (diff)
Add watchable slots to <meta-node> metaclass.
Diffstat (limited to 'starling/node.scm')
-rw-r--r--starling/node.scm19
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>))