;;;; cl-scopes/core - here comes the real action (defpackage :scopes/core (:use :common-lisp) (:local-nicknames (:config :scopes/config)) (:export #:config #:service-config #:message #:context #:name #:send #:printer)) (in-package :scopes/core) ;;;; config (defclass config (config:root) (services)) (defclass service-config (config:base) (start)) ;;;; message (defclass message () ((domain) (action) (class) (item) (sender) (timestamp) (data))) ;;;; context (defclass context () ((name :reader name :initarg :name) (action-handlers :accessor action-handlers :initform nil))) (defgeneric send (rcvr msg) (:method ((rcvr context) msg) (let ((hdlrs (action-handlers rcvr))) (funcall (car hdlrs) msg)))) (defvar *context* nil) ;;;; simple printer service (defun do-print (msg) (format t "~&~s~%" msg)) (defclass printer (context) ((action-handlers :initform (list #'do-print)))) (defun printer (name) (make-instance 'printer :name name))