anchor.diff:    (delete-duplicates (nconc (copy-list (direct-properties object))
                               (mapcan 'available-properties (object-parents object)))))
   
  +;;;
  +;;; Property-related convenience
  +;;;
  +
  +;;; Nicknames
  +(defun object-nickname (object)
  +  "Returns OBJECT's nickname"
  +  (property-value object 'nickname))
  +
  +(defun (setf object-nickname) (new-nickname object)
  +  "Sets OBJECT's nickname to NEW-NICKNAME"
  +  (handler-bind ((unbound-property 'continue))
  +    (setf (property-value object 'nickname) new-nickname)))
  +
  +;;; DOCUMENTATION
  +(defmethod documentation ((x object) (doc-type (eql 't)))
  +  (property-value x 'documentation))
  +
  +(defmethod (setf documentation) ((new-value string) (x object) (doc-type (eql 't)))
  +  (handler-bind ((unbound-property 'continue))
  +    (setf (property-value x 'documentation) new-value)))
  +
  +;;; DESCRIBE
   (defmethod describe-object ((object object) stream)
     (format stream
             "~&Object: ~A~@
  
positive.code:                           (available-properties object)))))
  
  ;;;
  ;;; Convenience
  ;;;
  (defmacro with-properties (properties object &body body)
    (let ((sh (gensym)))
  
negative.code:      (writers nil))))
  
  ;;;
  ;;; Base Property API
  ;;;
  (defun direct-property-value (object property-name)
    "Returns the property-value set locally in OBJECT for PROPERTY-NAME. If the
  