anchor.diff:  
   (defproto =money-market-account= (=checking-account= =savings-account=) ())
   
  -;; defsheep provides similar facilities to defproto, but without automatic accessor generation,
  +;; defobject provides similar facilities to defproto, but without automatic accessor generation,
   ;; and the objects remain anonymous.
   (defvar *account-of-bank-president*
  -  (defsheep (=bank-account=)
  +  (defobject (=bank-account=)
         ((customer-name "The Prez Man")
          (balance 9001))))
   
   (defvar *janes-account*
  -  (defsheep (=bank-account=)
  +  (defobject (=bank-account=)
         ((customer-name "Jane Doe")
          (balance 1000))))
   
  -;; SPAWN is the most minimalist of the 3 creation methods: it only accepts a list of prototypes.
  -;; The two advantages of using SPAWN are that A. it's a function, you can apply it. B. It's simple.
   (defvar *lots-of-accounts*
  -  (loop repeat 1000 collect (spawn =bank-account=)))
  +  (loop repeat 1000 collect (object :parents =bank-account=)))
   
   ;; you can add or remove direct properties from an object at any time, too...
   
  
positive.code: (defreply withdraw ((proxy =proxy-account=) amount)
    (withdraw (proxied-account proxy) amount))
  
  (defreply withdraw :before ((account *account-of-bank-president*) amount)
    (let ((overdraft (- amount (balance account))))
      (when (plusp overdraft)
        (incf (balance account) (embezzle *bank* overdraft)))))
  
  (defreply assess-low-balance-penalty ((account =bank-account=))
    (with-properties ((bal balance)) account
  
negative.code:    (account-number 0 :reader 'account-number)
     (account-type :bronze)))
  
  (defreply init-object :after ((account =bank-account=) &key)
    (setf (property-value account 'account-number) (incf *max-acc-num*)))
  
  ;; SHEEPLE-USER> (property-value =bank-account= 'customer-name) => "NoName"
  