anchor.diff:    (ancestor-p ancestor maybe-descendant))
   
   ;;;
  -;;; Property Access
  -;;;
  -
  +;;; Properties
  +;;;
  +
  +;;; Memoization
  +(defun memoize-property-access (sheep)
  +  (loop for property in (available-properties sheep)
  +     do (let ((owner (%get-property-owner sheep property)))
  +	  (setf (gethash property (sheep-property-owners sheep))
  +		owner))))
  +
  +
  +
  +(defun %get-property-owner (sheep property-name)
  +  (let ((hierarchy-list (sheep-hierarchy-list sheep)))
  +    (loop for sheep in hierarchy-list
  +       do (multiple-value-bind (prop-obj has-p)
  +	      (%get-property-object sheep property-name)
  +	    (declare (ignore prop-obj))
  +	    (when has-p
  +	      (return-from %get-property-owner sheep)))
  +       finally (error 'unbound-property))))
  +
  +(defun memoize-sheep-hierarchy-list (sheep)
  +  (let ((list (compute-sheep-hierarchy-list sheep)))
  +    (setf (sheep-hierarchy-list sheep)
  +	  list)
  +    (mapc (lambda (descendant) 
  +	    (memoize-sheep-hierarchy-list (weak-pointer-value descendant)))
  +	  (sheep-direct-children sheep))))
  +
  +;;; locked properties
   (define-condition unbound-property (sheeple-error)
     ())
   (define-condition locked-property (sheeple-error)
  
positive.code: (define-condition invalid-option-error (sheeple-error) ())
  
  (defun copy-all-values (sheep)
    (let ((all-property-names (available-properties sheep)))
      (mapc (lambda (pname)
  	    (setf (get-property sheep pname)
  		  (get-property sheep pname)))
  
negative.code: 		 (finalize child (lambda () (setf (sheep-direct-children new-parent)
  						  (delete pointer 
  							  (sheep-direct-children new-parent))))))
  	       child)
  	   (sheep-hierarchy-error ()
  	     (progn
  	       (setf (sheep-direct-parents child) (delete new-parent (sheep-direct-parents child)))
  	       (error 'sheep-hierarchy-error)))))))
  
  (defmethod add-parent :after ((new-parent standard-sheep) (child standard-sheep) &key)
    (declare (ignore new-parent))
    (memoize-sheep-hierarchy-list child)
    (memoize-property-access child)
    (loop for child-pointer in (sheep-direct-children child)
       do (memoize-property-access (weak-pointer-value child-pointer))))
  
  (defgeneric remove-parent (parent child &key))
  (defmethod remove-parent ((parent standard-sheep) (child standard-sheep) &key (keep-properties nil))
  