anchor.diff:    "Sets NEW-VALUE as the value of a direct-property belonging to SHEEP, named
   PROPERTY-NAME. If the property does not already exist anywhere in the hierarchy list, an error
   is signaled."
  +  ;; TODO - the changes to add-property may have changed the way this should work.
     (cond ((has-direct-property-p sheep property-name)
            (setf (%direct-property-value sheep property-name) new-value))
           ((has-property-p sheep property-name)
  
positive.code:     (setf %properties (make-vector *property-vector-initial-size*)))
  
    (defun %property-vector-full-p (sheep)
      "A property vector is full when all elements are non-NIL." (aand %properties
            (find nil it :test #'eq)))
  
    (defun %enlarge-property-vector (sheep)
      (let ((old-vector %properties))
        (setf %properties
              (make-vector (* *property-vector-grow-ratio* (length old-vector))))
        (dotimes (i (length old-vector))
          (setf (svref %properties i) (svref old-vector i))))
      (values))
  
    (defun %add-property-cons (sheep property-metaobject value)
      (let ((properties %properties))
        (if properties
  
negative.code:   (when (has-direct-property-p sheep property-name)
      (cerror "Add property anyway." "~A already has a direct property named ~A."
              sheep property-name))
    (let ((property-metaobject (if (has-property-p sheep property-name)
                                   (%direct-property-metaobject (property-owner sheep property-name))
                                   (defsheep (=standard-property=) ((name property-name))))))
      (%add-property-cons sheep property-metaobject value)))
  
  ;; TODO - remove-property should look at the property metaobject and remove any replies for
  