         (f event)))))
 
 (defn- find-handler
-  [component bus-key]
-  ; Protocols are hard-coded because satisfies? in ClojureScript is a macro and requires a protocol name as an argument
-  ; and passing a var doesn't work.
-  (case bus-key
-    ::all  (when (satisfies? IGotEvent component)
-             (partial got-event component))
-    ::bubbling (when (satisfies? IGotBubblingEvent component)
-                 (partial got-bubbling-event component))
-    ::trickling (when (satisfies? IGotTricklingEvent component)
-                  (partial got-trickling-event component))
-    nil))
+  [component bus-key protocols]
+  (when-let [handler-fn ((bus-key protocols) component)]
+    (partial handler-fn component)))
 
 (defn- shutdown-event-bus!
   "This function mainly shuts down event bus for this component.

           value
           options
           nil
           {::trickling (impl/event-bus (impl/trickling-router))})))

; =============================================================================
;; ### Triggering events.

           options
           out-event-ch
           {::bubbling (impl/event-bus (impl/bubbling-router))
            ::trickling (impl/event-bus (impl/trickling-router))}
           default-protocols)))

(defn root>
  "Use `root>` instead of om.core/root to add support for sending events from child components to parent components only.
