                 (or (= ns 'goog)
                     (not (contains? (::ana/namespaces @env/*compiler*) ns))))
 
-        ;; FIXME: this should be generic for IFn
-        ;; but we can't easily determine if something actually implements a given arity
-        ;; but some extra metadata would still let us determine if the arity we need is implemented
-        keyword? (or (= 'cljs.core/Keyword ftag)
-                     (let [f (ana/unwrap-quote f)]
-                       (and (= (-> f :op) :const)
-                            (keyword? (-> f :form)))))
+        ifn? (or (= 'cljs.core/Keyword ftag)
+                 ;; experiment with allowing not-native for ftag
+                 ;; (^not-native thing 1 2 3) as a way to tell the compiler to use IFn invoke
+                 ;; without checking. breaks if arity is not implemented, just like not-native for other protocols?
+                 (= 'not-native ftag)
+                 (let [f (ana/unwrap-quote f)]
+                   (and (= (-> f :op) :const)
+                        (keyword? (-> f :form)))))
 
         [f variadic-invoke]
         (if fn?

;; CLJS-3003
(core/defn- add-ifn-methods [type type-sym [f & meths :as form]]
  (core/let [this-sym (with-meta 'self__ {:tag type})
             argsym   (gensym "args")

             ;; we are emulating JS .call where the first argument will become this inside the fn
             ;; but this is not actually what we want when emulating IFn since we need "this"

                         (munge (name (:name info))) "$arity$" (count args))]
          (emits (first args) "." pimpl "(" (comma-sep (cons "null" (rest args))) ")"))

        ifn?
        (emits f ".cljs$core$IFn$_invoke$arity$" (count args) "(" (comma-sep args) ")")

        variadic-invoke
