        (ci-reduce string f start))))
 
 ;;hrm
-(set! js/String.prototype.call
-      (fn
-        ([_ coll]
-           (get coll (js* "this.toString()")))
-        ([_ coll not-found]
-           (get coll (js* "this.toString()") not-found))))
+(extend-type js/String
+  IFn
+  (-invoke
+    ([_ coll]
+       (get coll (js* "this.toString()")))
+    ([_ coll not-found]
+       (get coll (js* "this.toString()") not-found))))
 
 (set! js/String.prototype.apply
       (fn

  (-get-method [mf dispatch-val])
  (-methods [mf])
  (-prefers [mf])
  (-invoke [mf args]))

(defn- do-invoke
  [mf dispatch-fn args]
  (let [dispatch-val (apply dispatch-fn args)
        target-fn (-get-method mf dispatch-val)]

        (recur (inc i) (assoc out (aget ks i) (aget vs i)))
        out)))))

(extend-type cljs.core.HashMap
  IFn
  (-invoke
    ([_ k] (-lookup (js* "this") k))
    ([_ k not-found] (-lookup (js* "this") k not-found))))

(defn hash-map
  "keyval => key val
