         (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.


   This mult/tap magic happens only if the component reifies the `IGotEvent` protocol and, to some
   extend, for `IInitEventBus` protocol as well. For components that don't care about events, overhead is minimal."
  [this]
  (let [c (om/children this)
        {:keys [xform buf-or-n]} (merge default-config
                                        (when (satisfies? IInitEventBus c)
                                          (init-event-bus c)))
        catch-all-handler (find-handler c ::all)]
    (impl/with-options {:buf-or-n buf-or-n}
                       (om/set-state! this
                                      ::event-buses
                                      (into {}
                                            (for [[k bus] (om/get-state this ::event-buses)]
                                              (let [handler (compose-handlers catch-all-handler (find-handler c k))]
                                                [k (if handler
                                                     (impl/add-fork bus handler xform)
                                                     (impl/add-leg bus xform))])))))))

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

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