anchor.diff:        nil
         :cloneform nil))))
   
  -(defun ensure-message (&key name qualifiers lambda-list participants function body)
  +(defun message-name (message)
  +  (get-property message 'name))
  +(defun (setf message-name) (new-value message)
  +  (setf (get-property message 'name) new-value))
  +(defun message-buzzword (message)
  +  (get-property message 'buzzword))
  +(defun (setf message-buzzword) (new-value message)
  +  (setf (get-property message 'buzzword) new-value))
  +(defun message-qualifiers (message)
  +  (get-property message 'qualifiers))
  +(defun (setf message-qualifiers) (new-value message)
  +  (setf (get-property message 'qualifiers) new-value))
  +(defun message-lambda-list (message)
  +  (get-property message 'lambda-list))
  +(defun (setf message-lambda-list) (new-value message)
  +  (setf (get-property message 'lambda-list) new-value))
  +(defun message-participants (message)
  +  (get-property message 'participants))
  +(defun (setf message-participants) (new-value message)
  +  (setf (get-property message 'participants) new-value))
  +(defun message-body (message)
  +  (get-property message 'body))
  +(defun (setf message-body) (new-value message)
  +  (setf (get-property message 'body) new-value))
  +(defun message-function (message)
  +  (get-property message 'function))
  +(defun (setf message-function) (new-value message)
  +  (setf (get-property message 'function) new-value))
  +(defun message-documentation (message)
  +  (get-property message 'documentation))
  +(defun (setf message-documentation) (new-value message)
  +  (setf (get-property message 'documentation) new-value))
  +
  +(defun generate-sheep-standard-message (metasheep
  +					&key name
  +					buzzword
  +					qualifiers
  +					lambda-list
  +					participants
  +					function
  +					body
  +					(documentation ""))
  +  (let ((message (clone (=standard-message-metasheep=)
  +			((name name)
  +			 (buzzword buzzword)
  +			 (qualifiers qualifiers)
  +			 (lambda-list lambda-list)
  +			 (participants participants)
  +			 (function function)
  +			 (body body)
  +			 (documentation documentation)))))
  +    (add-message-to-buzzword message buzzword)
  +    (remove-messages-with-name-qualifiers-and-participants name qualifiers target-sheeple)
  +    (add-message-to-sheeple name message target-sheeple)))
  +
  +(defun ensure-message (name &rest all-keys)
     (when (not (find-buzzword name nil))
       (progn
         (warn 'style-warning)
         (ensure-buzzword
          :name name)))
  -  (let* ((target-sheeple (sheepify-list participants))
  -	 (message (make-instance 'standard-message
  -				 :name name
  -				 :qualifiers qualifiers
  -				 :lambda-list lambda-list
  -				 :participants participants
  -				 :body body
  -				 :function function)))
  -    (add-message-to-buzzword message (find-buzzword name))
  -    (remove-messages-with-name-qualifiers-and-participants name qualifiers target-sheeple)
  -    (add-message-to-sheeple name message target-sheeple)
  +  (let* ((buzzword (find-buzzword name))
  +	 (target-sheeple (sheepify-list participants))
  +	 (message (apply
  +		   (if (eql (sheep-metobject buzzword) =standard-buzzword-metasheep=)
  +		       #'generate-sheep-standard-message
  +		       #'generate-sheep
  +		       (buzzword-message-metasheep buzzword)
  +		       :name name
  +		       :buzzword buzzword
  +		       all-keys))))
       message))
  +
  +(defun add-message-to-buzzword (message buzzword)
  +  (pushnew message (buzzword-messages buzzword)))
  +
  +(defun remove-messages-with-name-qualifiers-and-participants (name qualifiers participants)
  +  (loop for sheep in participants
  +       do (loop for role in (sheep-direct-roles sheep)
  +	       do (when (and (equal name (role-name role))
  +			     (equal participants
  +				    (message-participants
  +				     (message-pointer role)))
  +			     (equal qualifiers
  +				    (message-qualifiers
  +				     (message-pointer role))))
  +		    (delete-role role sheep)))))
  +
  +(defun delete-role (role sheep)
  +  (setf (sheep-direct-roles sheep)
  +	(remove role (sheep-direct-roles sheep)))
  +  (setf (buzzword-messages (find-buzzword (role-name role)))
  +	(remove (message-pointer role) (buzzword-messages (find-buzzword (role-name role))))))
  +
  +(defun add-message-to-sheeple (name message sheeple)
  +  (let ((role-metasheep (buzzword-role-metasheep (find-buzzword name))))
  +    (loop 
  +       for sheep in sheeple
  +       for i upto (1- (length sheeple))
  +       do (push (clone (role-metasheep)
  +		       (name name)
  +		       (position i)
  +		       (message-pointer message))
  +		(sheep-direct-roles sheep)))))
  +
  +(defun undefine-message (&key name qualifiers participants)
  +  (remove-messages-with-name-qualifiers-and-participants name qualifiers participants))
  +
   ;; TODO
   ;(defun find-message (selector qualifiers participants &optional (errorp t)))
  +
   (defun add-readers-to-sheep (readers prop-name sheep)
     (loop for reader in readers
        do (ensure-buzzword :name reader)
  
positive.code:   (defun forget-buzzword (name)
      (remhash name buzzword-table))
  ) ; end buzzword table closure
  (defun undefine-buzzword (&key name)
    (let ((buzzword (find-buzzword name nil)))
      (when buzzword
  
negative.code: 		    &allow-other-keys)
    "Creates a new sheep with SHEEPLE as its parents, and PROPERTIES as its properties"
    (let ((sheep (apply (if (eql metasheep =standard-sheep-metasheep=)
  			  #'generate-sheep-std-metasheep
  			  #'generate-sheep
  			  metasheep sheeple properties all-keys))))
      sheep))
  