(defpackage :fwoar.server-aware-class
(:use :cl )
(:export
#:server-aware-class
#:serializable
#:publish-value
#:server))
(in-package :fwoar.server-aware-class)
(defgeneric publish-value (server class slot old-value new-value)
)
(defclass server-aware-class (standard-class)
((%server :accessor server :initform nil)))
(defclass serializable ()
())
(defmethod closer-mop:validate-superclass ((meta server-aware-class) (class standard-class))
t)
(defmethod (setf closer-mop:slot-value-using-class) :around (new-value (class server-aware-class) object slotd)
(if (and (server class) (c2mop:slot-boundp-using-class class object slotd))
(let ((old-value (c2mop:slot-value-using-class class object slotd)))
(call-next-method)
(publish-value (server class) (closer-mop:class-prototype class) (closer-mop:slot-definition-name slotd)
old-value new-value))
(call-next-method)))
|