          (defmethod ~pred-name ~default-case [& _#] false)
          nil)))
 
-(defmacro extend-variant [name tag args & body]
+(defmacro extend-variant
+  "Extends a previously defined function over a variant adding a new method for
+  the given tag to its body and extending its predicate to indicate that the tag
+  for which support was just added is an element of the set of tags for which
+  there are dispatch values.
+
+  Ex. => (deftag a [a])
+      nil
+      => (defvariant aable)
+      nil
+      => (extend-variant aable a [{:a a-val}] (inc a-val))
+      nil
+      => (aable? (a 1))
+      true
+      => (aable (a 1))
+      2"
+  [name tag args & body]
   (let [variant-var  (resolve name)
         variant-meta (meta variant-var)
         _            (assert (get variant-meta :variants/variant) "Tried to extend a non-variant!")

    `(do (defmethod ~name         ~tag-keyword [[_# ~@args]] ~@body)
         (defmethod ~variant-pred ~tag-keyword [& _#] true)
         nil)))

           [~kw-tag (hash-map ~@(interleave kw-members members))])
         nil)))

(defmacro defvariant
  "Defines a function over an open variant and a predicate returning true if the
  function is implemented for a given tagged value.

  Ex. => (defvariant foo)
      nil
      => (deftag a [a b c])
      nil
      => (foo (a 1 2 3))
      ;; No Such Method exception
      => (foo? (a 1 2 3))
      false"
  [variant-name]
  (let [pred-name    (symbol (str (name variant-name) "?"))
        default-case (keyword (name (gensym)))]
    `(do (defmulti ~pred-name first
