       (named? pred) (cond-> (the-spec pred) gfn (with-gen gfn))
       :else
       (reify
-       clojure.lang.IFn
-       (invoke [this x] (valid? this x))
        Spec
        (conform* [_ x] (dt pred x form cpred?))
        (unform* [_ x] (if cpred?

  [argspec aform retspec rform fnspec fform gfn]
  (let [specs {:args argspec :ret retspec :fn fnspec}]
    (reify
     clojure.lang.IFn
     (invoke [this x] (valid? this x))
     
     clojure.lang.ILookup
     (valAt [this k] (get specs k))
     (valAt [_ k not-found] (get specs k not-found))

        keys->specs #(c/or (k->s %) %)
        id (java.util.UUID/randomUUID)]
    (reify
     Spec
     (conform* [_ m]
               (if (keys-pred m)
