   (:require [om.core :as om :include-macros true]
             [cljs.core.async :as async])
   (:require-macros [cljs.core.async.macros :as async]))
+
+;; =============================================================================
+
+(def ^:dynamic ^:private *parent*)
 
 ;; =============================================================================
 ;; Event handling protocol. Use it in your components if you're interested

  [event-bus]
  (fn [f x m]
    (let [parent-bus (or
                       (and om/*parent* (om/get-state om/*parent* ::event-bus))
                       event-bus)]
      (om/build* f x (update-in m [:init-state] merge {::event-bus parent-bus})))))


    (root> f value options (async/chan 1)))
  ([f value options event-bus]
    (om/root f value
             (merge options {:descriptor (make-descriptor {:componentWillMount
                                                           (fn [this super]
                                                             (js/console.log "init-event-bus!")
                                                             (init-event-bus! this)
                                                             (super))
                                                           :render
                                                           (fn [this super]
                                                             (binding [*parent* this]
                                                               (super)))})
                             :instrument (make-instrument-fn event-bus)}))))

(defn trigger
