   supplied defaults to, and modifies, the global hierarchy."
   ([tag parent]
      ;; (alter-var-root #'global-hierarchy underive tag parent)
-     (swap! global-hierarchy derive tag parent) nil)
+     (swap! global-hierarchy underive tag parent) nil)
   ([h tag parent]
     (let [parentMap (:parents h)
 	  childsParents (if (parentMap tag)

  ;; vary-meta
  (assert (= {:a 1} (meta (vary-meta [] assoc :a 1))))
  (assert (= {:a 1 :b 2} (meta (vary-meta (with-meta [] {:b 2}) assoc :a 1))))
  :ok
  )


  (or (prefers* x y prefer-table) (isa? x y)))

(defn- find-and-cache-best-method
  [name dispatch-val hierarchy method-table prefer-table method-cache cached-hierarchy]
  (let [best-entry (reduce (fn [be [k _ :as e]]
			     (when (isa? dispatch-val k)
			       (let [be2 (if (or (nil? be) (dominates k (first be) prefer-table))
