(in-package :kira) (defmacro removing-from (&body body) `(macrolet ((update-map (&rest args) `(remove-kv ,@args)) (update-collection (&rest args) `(remove-from ,@args)) (update-instance (instance &rest args) (rebinding (instance) `(when ,instance (remove-from-instance ,instance ,@args))))) ,@body)) (defmacro adding-to (&body body) `(macrolet ((update-map (&rest args) `(add-kv ,@args)) (update-collection (&rest args) `(add-to ,@args)) (update-instance (instance &rest args) (rebinding (instance) `(when ,instance (add-to-instance ,instance ,@args))))) ,@body)) (defmacro update-instances (instances object) `(do-collection (instance ,instances) (update-instance instance ,object))) (defmethod method-names ((name (eql nil))) (values 'unrealize 'realize)) (defmethod method-names ((name (eql 'instance))) (values 'remove-from-instance 'add-to-instance)) (define-method-macro define-update-methods (&qualifiers qualifiers lambda-list &body body) (multiple-value-bind (remove add) (method-names (first qualifiers)) `(progn (defmethod ,remove progn ,lambda-list (removing-from ,@body)) (defmethod ,add progn ,lambda-list (adding-to ,@body)))))