anchor.diff:                   :value value))
   
   (defmethod equals ((fn1 handler) (fn2 handler))
  -  "Return non-nil if FN1 and FN2 are equal."
  +  "Return non-nil if FN1 and FN2 are equal.
  +Handlers are equal if they are setters of the same place and same value, or if
  +their names are equal."
     (cond
       ((or (and (place fn1)
                 (not (place fn2) ))
  
positive.code: 
  (defmethod combine-hook-until-success ((hook hook) &rest args)
    "Return the value of the first non-nil result.
  Handlers after the successful one are not run."
    (loop for handler in (handlers hook)
            thereis (apply (fn handler) args)))
  
  (defmethod combine-composed-hook ((hook hook) &rest args)
    "Return the result of the composition of the HOOK handlers on ARGS, from oldest to youngest."
    (apply (apply #'alexandria:compose (mapcar #'fn (handlers hook))) args))
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
negative.code:          ((handler-class :initform (find-class ',handler-class-name))))
         (defmethod add-hook ((hook ,hook-class-name) (handler ,handler-class-name) &key append)
           ,(format nil "Add HANDLER to HOOK.
  HOOK must be of type ~a
  HANDLER must be of type ~a."
                    hook-class-name
                    handler-class-name)
           (add-hook-internal hook handler :append append)))))
  
  ;; TODO: Add make-hook-* function?
  
  (define-hook-type void (function ()))
  (define-hook-type string->string (function (string) string))
  