                                     #(tag % k)
                                     (gensub p overrides (conj path k) rmap (list 'method form k))))))))
                       gs (->> (methods @mmvar)
-                              (remove (fn [[k]] (= k ::invalid)))
+                              (remove (fn [[k]] (invalid? k)))
                               (map gen)
                               (remove nil?))]
                   (when (every? identity gs)

                  (loop [ret x i 0]
                    (if (< i (count specs))
                      (let [nret (conform* (specs i) ret)]
                        (if (= ::invalid nret)
                          ::invalid
                          ;;propagate conformed values
                          (recur nret (inc i))))

  [keys forms preds gfn]
  (let [id (java.util.UUID/randomUUID)
        kps (zipmap keys preds)
        specs (delay (mapv specize preds forms))
        cform (case (count preds)
                    2 (fn [x]
                        (let [specs @specs
                              ret (conform* (specs 0) x)]
                          (if (invalid? ret)
                            (let [ret (conform* (specs 1) x)]
                              (if (invalid? ret)
                                ::invalid
                                (tagged-ret (keys 1) ret)))
                            (tagged-ret (keys 0) ret))))
                    3 (fn [x]
                        (let [specs @specs
                              ret (conform* (specs 0) x)]
                          (if (invalid? ret)
                            (let [ret (conform* (specs 1) x)]
                              (if (invalid? ret)
                                (let [ret (conform* (specs 2) x)]
                                  (if (invalid? ret)
                                    ::invalid
                                    (tagged-ret (keys 2) ret)))
                                (tagged-ret (keys 1) ret)))
