anchor.diff:  (defgeneric remove-all-direct-properties (sheep)
     (:documentation "Wipes out all direct properties and their values from SHEEP."))
   
  -(defgeneric has-direct-property-p (sheep property)
  -  (:documentation "Returns T if SHEEP has PROPERTY as a direct property. NIL otherwise."))
  +(defgeneric has-direct-property-p (sheep property-name)
  +  (:documentation "Returns T if SHEEP has a property called PROPERTY-NAME as a direct property. 
  +NIL otherwise."))
   
   (defgeneric has-property-p (sheep property-name)
     (:documentation "Returns T if calling PROPERTY-VALUE on SHEEP using the same property-name
  
positive.code:   (loop for pname being the hash-keys of (sheep-property-value-table sheep)
       collect (direct-property-spec sheep pname)))
  
  (defun direct-property-spec (sheep property-name)
    (unless (has-direct-property-p sheep property-name)
      (signal 'unbound-property))
    (nth-value 0 (gethash property-name (sheep-property-spec-table sheep))))
  
negative.code:          (loop for obj in (sheep-hierarchy-list sheep)
              when (has-direct-property-p obj property-name)
              return obj)))
      (or owner
          (if errorp
              (error 'unbound-property
                     :format-control "Property ~A is unbound for sheep ~S"
  