4358148e |
1 | (in-package :lisp-on-lines) |
2 | |
3 | (define-description standard-object () |
4 | ((class-slots :label "Slots" |
5 | :function (compose 'class-slots 'class-of)))) |
6 | |
81d70610 |
7 | (define-layered-class slot-definition-attribute (standard-attribute) |
8 | ((slot-name :initarg :slot-name :accessor attribute-slot-name))) |
9 | |
10 | (define-layered-method attribute-value (object (attribute slot-definition-attribute)) |
4271ab0b |
11 | (if (slot-boundp object (attribute-slot-name attribute)) |
12 | |
13 | (slot-value object (attribute-slot-name attribute)) |
14 | (gensym "UNBOUND-SLOT-"))) |
15 | |
16 | (defmacro define-description-for-class (class-name &optional (name (intern (format nil "DESCRIPTION-FOR-~A" class-name)))) |
17 | `(progn |
18 | (define-description ,name (standard-object) |
19 | ,(loop :for slot in (class-slots (find-class class-name)) |
20 | :collect `(,(slot-definition-name slot) |
21 | :attribute-class slot-definition-attribute |
22 | :slot-name ,(slot-definition-name slot) |
23 | :label ,(slot-definition-name slot))) |
24 | (:mixinp t)) |
25 | (unless (ignore-errors (find-description ',class-name)) |
26 | (define-description ,class-name (,name) ())))) |
27 | |
81d70610 |
28 | |
29 | |
4358148e |
30 | (define-layered-method description-of ((object standard-object)) |
4271ab0b |
31 | (or (ignore-errors (find-description (class-name (class-of object)))) |
32 | (find-description 'standard-object))) |
33 | |
4358148e |
34 | |
35 | |
36 | |