       (cond
        opt-not?
        (emits "!(" (first args) ")")
+
+       proto?
+       (let [pimpl (str (protocol-prefix protocol)
+                        (munge (name (:name info))) "$arity$" (count args))]
+         (emits (first args) "." pimpl "(" (comma-sep args) ")"))
 
        keyword?
        (emits "(new cljs.core.Keyword(" f ")).call(" (comma-sep (cons "null" args)) ")")

    (emit-block (if (= :expr context) :return context) statements ret)
    (when (= :expr context) (emits "})()"))))

(defmethod emit :invoke
  [{:keys [f args env] :as expr}]
  (let [info (:info f)

        protocol (:protocol info)
        proto? (let [tag (infer-tag (first (:args expr)))]
                 (and protocol tag
                      (or *cljs-static-fns*
                          (:protocol-inline env))
                      (when-let [ps (:protocols (resolve-existing-var (dissoc env :locals) tag))]
                        (ps protocol))))
