   (print "  actual: ") (prn (:actual m))
   (inc-report-counter env :error))
 
-(defmethod report :summary [env m]
+(defmethod report [::default :summary] [env m]
   (println "\nRan" (:test m) "tests containing"
     (+ (:pass m) (:fail m) (:error m)) "assertions.")
   (println (:fail m) "failures," (:error m) "errors.")
   env)
 
-(defmethod report :begin-test-ns [env m]
+(defmethod report [::default :begin-test-ns] [env m]
   (println "\nTesting" (name (:ns m)))
   env)
 
 ;; Ignore these message types:
-(defmethod report :end-test-ns [env m] env)
-(defmethod report :begin-test-var [env m] env)
-(defmethod report :end-test-var [env m] env)
-
-(deftype DefaultReporter []
-  ITestReporter
-  (-do-report [_ env m]
-    (report env m)))
-
-(defn default-reporter []
-  (DefaultReporter.))
+(defmethod report [::default :end-test-ns] [env m] env)
+(defmethod report [::default :begin-test-var] [env m] env)
+(defmethod report [::default :end-test-var] [env m] env)
 
 (defn file-and-line
   [exception depth]

  cljs.test
  (:require-macros
   [clojure.template :as temp]))

;; =============================================================================
;; Protocols

(defprotocol ITestReporter
  (-do-report [_ env m]))

;; =============================================================================
;; Default Reporting

   'is' call 'report' to indicate results.  The argument given to
   'report' will be a map with a :type key."
     :dynamic true}
  report (fn [env m] [(:reporter env) (:type m)]))

(defmethod report :default [env m]
  (prn m))

(defmethod report [::default :pass] [env m]
  (inc-report-counter env :pass))

(defmethod report [::default :fail] [env m]
  (println "\nFAIL in" (testing-vars-str env m))
  (when (seq (:testing-contexts env))
    (println (testing-contexts-str env)))
