anchor.diff:    (warn 'deprecated-feature :feature #'remove-property :version "3.0.2")
     (property-makunbound object property-name))
   
  -(defun remove-all-direct-properties (object)
  +(defmopfun remove-all-direct-properties (object)
     "Wipes out all direct properties and their values from OBJECT."
  -  (if (std-object-p object)
  -      (std-sheeple:remove-all-direct-properties object)
  -      (smop:remove-all-direct-properties (object-metaobject object) object)))
  -(defun std-sheeple:remove-all-direct-properties (object)
     (change-mold object (ensure-mold (object-parents object) #()))
     object)
  -
   
   ;;;
   ;;; Value
   ;;;
  -(defun property-value (object property-name)
  +(defmopfun property-value (object property-name)
     "Returns the property-value for PROPERTY-NAME found first in OBJECT's hierarchy list.
   If the value does not exist in the hierarchy list, a condition of type `unbound-property'
   is signaled."
  -  (if (std-object-p object)
  -      (std-sheeple:property-value object property-name)
  -      (smop:property-value (object-metaobject object) object property-name)))
  -(defun std-sheeple:property-value (object property-name)
     (check-type property-name symbol)
     (dolist (ancestor (object-hierarchy-list object)
              (error 'unbound-property :object object :property-name property-name))
  
positive.code: ;;;
  ;;; Existential
  ;;;
  (defun direct-property-value (object property-name)
    "Returns the property-value set locally in OBJECT for PROPERTY-NAME. If the
  property is not set locally, a condition of type `unbound-property' is signaled."
    (if (std-object-p object)
        (std-sheeple:direct-property-value object property-name)
        (smop:direct-property-value (object-metaobject object) property-name)))
  (defun std-sheeple:direct-property-value (object property-name)
    (check-type property-name symbol)
    (aif (property-position property-name object)
         (svref (%object-property-values object) it)
  
negative.code: ;;;
  ;;; Reflection API
  ;;;
  (defmopfun property-owner (object property-name)
    "Returns the object, if any, from which OBJECT would fetch the value for PROPERTY-NAME"
    (find-if (rcurry 'direct-property-p property-name) (object-hierarchy-list object)))
  
  (defmopfun direct-properties (object)
    "Returns a list of the names of OBJECT's direct properties -- ie, only ones which have been
  set directly in OBJECT using (setf property-value). The consequences of side-effecting this
  returned list are undefined."
    (coerce (mold-properties (%object-mold object)) 'list))
  
  (defmopfun available-properties (object)
    "Returns a list of the names of all properties available to OBJECT, including inherited ones."
    (delete-duplicates (nconc (copy-list (direct-properties object))
                              (mapcan 'available-properties (object-parents object)))))
  
  