;;;; object-external.lisp --- Hooks that reside outside of objects ;;;; ;;;; Copyright (C) 2010, 2011, 2012, 2013, 2014 Jan Moringen ;;;; ;;;; Author: Jan Moringen (cl:in-package #:hooks) ;;; Object Hook Protocol (defgeneric external-hook (object hook) (:documentation "Return a representation of the slot residing outside of OBJECT under the name HOOK.")) ;;; Object Hook Class (defclass external-hook (internal-combination-mixin internal-handlers-mixin internal-documentation-mixin simple-printing-mixin activatable-mixin) ((name :initarg :name :type symbol :reader hook-name :documentation "The name of this hook.")) (:default-initargs :name (required-argument :name)) (:documentation "Instances of this class represent hooks that reside outside of objects.")) ;;; Implementation of the External Object Hook Protocol (defmethod external-hook ((object t) (hook symbol)) (let ((table (or (get hook 'external-hook-objects) (setf (get hook 'external-hook-objects) (trivial-garbage:make-weak-hash-table :test #'eq :weakness :key))))) (ensure-gethash object table (make-instance 'external-hook :name hook))))