anchor.diff:    (or (find-if (fun (has-direct-property-p _ property-name)) (sheep-hierarchy-list sheep))
         (when errorp (error 'unbound-property :sheep sheep :property-name property-name))))
   
  -(defun property-metaobject-p (obj)
  -  (and (sheepp obj)
  -       (find =standard-property= (sheep-hierarchy-list obj))))
  -
  -(defun direct-property-metaobject (sheep property-name &optional errorp)
  -  "Returns the direct local metaobject for a property named PROPERTY-NAME."
  -  (or (%direct-property-metaobject sheep property-name)
  -      (when errorp (error 'unbound-property :sheep sheep :property-name property-name))))
  -
  -(defun sheep-direct-properties (sheep)
  -  "Returns a set of direct property definition metaobjects."
  -  (map 'list #'car (%sheep-direct-properties sheep)))
  -
  -(defun available-properties (sheep)
  -  "Returns a list of property objects describing all properties available to SHEEP, including
  -inherited ones."
  -  (let* ((direct-properties (sheep-direct-properties sheep))
  -         (avail-property-names (mapcar (fun (property-name _))
  -                                       (remove-duplicates
  -                                        (flatten
  -                                         (append direct-properties
  -                                                 (mapcar #'available-properties
  -                                                         (sheep-parents sheep))))
  -                                        :key #'property-name))))
  -    (mapcar (fun (direct-property-metaobject (property-owner sheep _ nil) _))
  -            avail-property-names)))
  -
  -(defun property-summary (sheep &optional (stream *standard-output*))
  -  "Provides a pretty-printed representation of SHEEP's available properties."
  -  (format stream
  -          "~&Sheep: ~A~%Properties:~% ~{~{~&~3TName: ~13T~A~%~3TValue: ~13T~S~%~
  -           ~3TOwner: ~13T~A~%~%~}~}"
  -          sheep (mapcar (fun (list (property-name _)
  -                                   (property-value sheep (property-name _))
  -                                   (property-owner sheep (property-name _))))
  -                        (available-properties sheep))))
  -
  -(defun direct-property-summary (sheep &optional stream)
  -  "Provides a pretty-printed representation of SHEEP's direct properties."
  -  (format stream
  -          "~&Sheep: ~A~%~
  -           Direct Properties: ~%~%~
  -           ~{~{~&~3TName: ~A~%~3TValue: ~S~%~%~}~}"
  -          sheep (mapcar (fun (list (property-name _)
  -                                   (direct-property-value sheep (property-name _))))
  -                        (sheep-direct-properties sheep))))
  +;; (defun property-metaobject-p (obj)
  +;;   (and (sheepp obj)
  +;;        (find =standard-property= (sheep-hierarchy-list obj))))
  +
  +;; (defun direct-property-metaobject (sheep property-name &optional errorp)
  +;;   "Returns the direct local metaobject for a property named PROPERTY-NAME."
  +;;   (or (%direct-property-metaobject sheep property-name)
  +;;       (when errorp (error 'unbound-property :sheep sheep :property-name property-name))))
  +
  +;; (defun sheep-direct-properties (sheep)
  +;;   "Returns a set of direct property definition metaobjects."
  +;;   (map 'list #'car (%sheep-direct-properties sheep)))
  +
  +;; (defun available-properties (sheep)
  +;;   "Returns a list of property objects describing all properties available to SHEEP, including
  +;; inherited ones."
  +;;   (let* ((direct-properties (sheep-direct-properties sheep))
  +;;          (avail-property-names (mapcar (fun (property-name _))
  +;;                                        (remove-duplicates
  +;;                                         (flatten
  +;;                                          (append direct-properties
  +;;                                                  (mapcar #'available-properties
  +;;                                                          (sheep-parents sheep))))
  +;;                                         :key #'property-name))))
  +;;     (mapcar (fun (direct-property-metaobject (property-owner sheep _ nil) _))
  +;;             avail-property-names)))
  +
  +;; (defun property-summary (sheep &optional (stream *standard-output*))
  +;;   "Provides a pretty-printed representation of SHEEP's available properties."
  +;;   (format stream
  +;;           "~&Sheep: ~A~%Properties:~% ~{~{~&~3TName: ~13T~A~%~3TValue: ~13T~S~%~
  +;;            ~3TOwner: ~13T~A~%~%~}~}"
  +;;           sheep (mapcar (fun (list (property-name _)
  +;;                                    (property-value sheep (property-name _))
  +;;                                    (property-owner sheep (property-name _))))
  +;;                         (available-properties sheep))))
  +
  +;; (defun direct-property-summary (sheep &optional stream)
  +;;   "Provides a pretty-printed representation of SHEEP's direct properties."
  +;;   (format stream
  +;;           "~&Sheep: ~A~%~
  +;;            Direct Properties: ~%~%~
  +;;            ~{~{~&~3TName: ~A~%~3TValue: ~S~%~%~}~}"
  +;;           sheep (mapcar (fun (list (property-name _)
  +;;                                    (direct-property-value sheep (property-name _))))
  +;;                         (sheep-direct-properties sheep))))
  
positive.code:     (cerror "Add property anyway." "~A already has a direct property named ~A."
              sheep property-name)
      (remove-property sheep property-name))
    (%add-property-cons sheep
                        (if (has-property-p sheep property-name)
                            (%direct-property-metaobject (property-owner sheep property-name)
                                                         property-name)
                            (defsheep (=standard-property=) ((name property-name))))
                        value))
  
  ;; TODO - remove-property should look at the property metaobject and remove any replies for
  ;;        accessors that it points to. This will have to wait until reply-undefinition works
  
negative.code:   (property-value-with-hierarchy-list sheep property-name))
  
  (defun property-value-with-hierarchy-list (sheep property-name)
    ;; todo - this is leaky and ugly
    (map nil (fun (when (has-direct-property-p _ property-name)
                    (return-from property-value-with-hierarchy-list
                      (direct-property-value _ property-name))))
  