From 6b1cc0172be81b2c6790bc4460b1d0520d966123 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Tue, 27 Dec 2022 08:57:40 -0500 Subject: mixins: Add class. --- catbird/mixins.scm | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/catbird/mixins.scm b/catbird/mixins.scm index 2443bc1..75e6d50 100644 --- a/catbird/mixins.scm +++ b/catbird/mixins.scm @@ -74,8 +74,14 @@ position-y width height - depth) - #:replace (pause)) + depth + + + ignore + listen + responds-to? + send) + #:replace (listen pause send)) (define-class () (name #:accessor name #:init-keyword #:name #:init-value #f)) @@ -227,3 +233,34 @@ (define-accessor width) (define-accessor height) (define-accessor depth) + + + +;;; +;;; Event listener +;;; + +;; For per-instance message passing/event handling. +(define-class () + (event-handlers #:getter event-handlers #:init-thunk make-hash-table)) + +;; listen and send are built-in procedures, so make them generic. +(define-generic listen) +(define-generic send) + +(define-method (listen (listener ) message proc) + (hashq-set! (event-handlers listener) message proc)) + +(define-method (ignore (listener ) message) + (hashq-remove! (event-handlers listener) message)) + +(define-method (event-handler (listener ) message) + (hashq-ref (event-handlers listener) message)) + +(define-method (responds-to? (listener ) message) + (procedure? (event-handler listener))) + +(define-method (send (listener ) message . args) + (let ((handler (event-handler listener message))) + (and (procedure? handler) + (apply handler args)))) -- cgit v1.2.3