+(define-layered-function display-attribute (attribute)
+ (:method (attribute)
+ (display-using-description attribute *display* (attribute-object attribute))))
+
+(define-layered-function display-attribute-label (attribute)
+ (:method (attribute)
+ (funcall (attribute-label-formatter attribute) (attribute-label attribute))))
+
+
+
+(define-layered-function display-attribute-value (attribute)
+ (:method (attribute)
+ (flet ((disp (val &rest args)
+ (apply #'display *display* val
+ :activate (attribute-active-descriptions attribute)
+ :deactivate (attribute-inactive-descriptions attribute)
+ args)))
+
+ (let ((val (attribute-value attribute)))
+ (if (eql val (attribute-object attribute))
+ (generic-format *display* (funcall (attribute-value-formatter attribute) val))
+ (with-active-descriptions (inline)
+ (if (slot-boundp attribute 'active-attributes)
+ (disp val :attributes (slot-value attribute 'active-attributes))
+ (disp val))))))))
+
+(define-layered-method display-using-description
+ ((attribute standard-attribute) display object &rest args)
+ (declare (ignore args))
+ (when (attribute-label attribute)
+ (display-attribute-label attribute))
+ (display-attribute-value attribute))
+