anchor.diff:           ;; itself cannot be side-effected. That restriction allows us,
            ;; in the common case of a property already existing in the hierarchy,
            ;; to reuse the property metaobject by just adding a pointer to it locally.
  -         (let ((owner-prop-mo #+sheeple3.1 (car (%get-property-cons
  -                                                 (property-owner object property-name)
  -                                                 property-name))
  -                              #-sheeple3.1 property-name))
  +         (let ((owner-prop-mo property-name))
              (%add-property-cons object owner-prop-mo new-value)))
           (t (cerror "Add the property locally" 'unbound-property
                      :object object
  
positive.code:                                      `(,var-name
                                         (property-value ,sh ',property-name))))
                                   properties)
           ,@body))))
negative.code:   (or (find-if (rcurry 'has-direct-property-p property-name) (object-hierarchy-list object))
        (when errorp (error 'unbound-property :object object :property-name property-name))))
  
  (defun object-direct-properties (object)
    "Returns a set of direct property definition metaobjects."
    (awhen (%object-properties object)
      (loop for prop across it when prop collect (car prop))))
  
  (defun available-properties (object)
    "Returns a list of property objects describing all properties available to OBJECT, including
  inherited ones."
    (delete-duplicates (append (object-direct-properties object)
                               (mapcan 'available-properties (object-parents object)))))
  
  