;;;; A description is an object which is used
;;;; to describe another object.
-;;; HACK:
-;;; Since i'm not using deflayer, ensure-layer etc,
-;;; There are a few places where contextl gets confused
-;;; trying to locate my description layers.
-
-;;; TODO: investigate switching to deflayer!
-
-(defun contextl::prepare-layer (layer)
- (if (symbolp layer)
- (if (eq (symbol-package layer)
- (find-package :description-definers))
- layer
- (contextl::defining-layer layer))
-
- layer))
-
-(defmethod find-layer-class :around ((layer symbol) &optional errorp environment)
- (if (eq (symbol-package layer)
- (find-package :description-definers))
- (find-class layer)
- (call-next-method)))
;;; #+HACK
;;; I'm having some 'issues' with
(define-layered-class description-access-class (standard-layer-class contextl::special-layered-access-class )
((defined-in-descriptions :initarg :in-description)
+ (class-active-attributes-definition :initarg :attributes)
(mixin-class-p :initarg :mixinp)))
(defmethod direct-slot-definition-class
attribute))
(defmethod slot-value-using-class ((class description-access-class) object slotd)
- (if (or
+ (call-next-method)
+#+nil (if (or
(eq (slot-definition-name slotd) 'described-object)
(not (slot-boundp slotd 'attribute-object)))
(call-next-method)
(slot-definition-attribute-object slotd)))
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defparameter *description-attributes* (make-hash-table)))
+
+
+
(defclass standard-description-class (description-access-class layered-class)
- ()
+ ((attributes :accessor description-class-attributes :initform (list)))
(:default-initargs :defining-metaclass 'description-access-class))
+
+
(defmethod validate-superclass
((class standard-description-class)
(superclass standard-class))
(defun description-class-name (description-class)
(read-from-string (symbol-name (class-name description-class))))
-
-(defun initialize-description-class (class)
-;;; HACK: initialization does not happ en properly
-;;; when compiling and loading or something like that.
-;;; Obviously i'm not sure why.
-;;; So we're going to explicitly initialize things.
-;;; For now. --drewc
-
- (pushnew class *defined-descriptions*)
-
-;;; ENDHACK.
-
- (let* ((description (find-layer class))
- (attribute-objects
- (mapcar
- (lambda (slot)
- (let* ((*init-time-description* description)
- (attribute (apply #'make-instance
- 'standard-attribute
- :description description
- (attribute-object-initargs slot))))
-
-
- (setf (slot-definition-attribute-object slot) attribute)))
- (remove 'described-object (class-slots (class-of description))
- :key #'slot-definition-name)))
- (defining-classes (partial-class-defining-classes (class-of description))))
+(defgeneric standard-description-p (description-candidate)
+ (:method (not-description)
+ NIL)
+ (:method ((description standard-description-object))
+ T))
+
+(defun compute-effective-attribute-objects (description)
+ (mapcar
+ (lambda (slot)
+ (or (find-attribute description
+ (slot-definition-name slot) nil)
+ (let* ((*init-time-description* description)
+ (attribute-class (or
+ (ignore-errors
+ (slot-value-using-class
+ (class-of description) description slot))
+ 'standard-attribute))
+ (attribute
+ (apply #'make-instance
+ attribute-class
+ :description description
+ :attribute-class attribute-class
+ (attribute-object-initargs slot))))
+ (setf (slot-definition-attribute-object slot) attribute))))
+ (remove 'described-object (class-slots (class-of description))
+ :key #'slot-definition-name)))
+
+(defun initialize-effective-attribute-values-for-description-class (class description attribute-objects)
(loop
:for (layer class)
- :on defining-classes :by #'cddr
+ :on (partial-class-defining-classes class) :by #'cddr
:do (funcall-with-layer-context
(adjoin-layer (find-layer layer) (current-layer-context))
(lambda ()
(apply #'reinitialize-instance attribute
initargs )
- (when (not (eq (find-class (attribute-class attribute))
- (class-of attribute)))
-
- (apply #'change-class attribute (attribute-class attribute)
- initargs)))
-
+ (setf (slot-value description (attribute-name attribute))
+ (attribute-class attribute))
+ (apply #'change-class attribute (find-class (attribute-class attribute))
+ initargs))))
+ (when (slot-boundp class 'class-active-attributes-definition)
+ (with-described-object (nil description)
+ (setf (slot-value (find-attribute description 'active-attributes) 'value)
+ (slot-value class 'class-active-attributes-definition))))))))
+
+(defun initialize-description-class (class)
+
+;;; HACK: initialization does not happ en properly
+;;; when compiling and loading or something like that.
+;;; Obviously i'm not sure why.
+;;; So we're going to explicitly initialize things.
+;;; For now. --drewc
+
+ (pushnew class *defined-descriptions*)
+
+;;; ENDHACK.
+
+ (let* ((description (find-layer class))
+ (attribute-objects
+ (setf (description-class-attributes (class-of description))
+ (compute-effective-attribute-objects description))))
+
+ (initialize-effective-attribute-values-for-description-class class description attribute-objects)
+))
+
- )))))))
;;;; HACK: run this at startup till we figure things out.
(defun initialize-descriptions ()
(print-unreadable-object (object stream :type t :identity t)
(princ (ignore-errors (description-print-name (find-layer object))) stream)))
-(defun find-description (name)
- (find-layer (find-class (defining-description name))))
+(defun find-description (name &optional (errorp t))
+ (let ((class (find-class (defining-description name) errorp)))
+ (when class (find-layer class))))