       (prn (.-timeStamp event) " ... was not yet handled!")
       true)))
 
-(defn handle-click [e state]
+(defn handle-enter [e ->self]
+  (when-let [cb (get-in @->self [:morph :onMouseEnter])]
+              (cb ->self)))
+
+(defn handle-leave [e ->self]
+  (when-let [cb (get-in @->self [:morph :onMouseLeave])]
+              (cb ->self)))
+
+(defn handle-click [e ->self]
   ; add/remove morph from preserve list
   ; (branch-merge/toggle-preserve state)
   ; handle the custom behavior
   (when (and (not-yet-handled e) (.-altKey e))
-    (@right-click-behavior e @state))
-  (when-let [cb (get-in @state [:morph :onClick])] 
-              (cb state)))
+    (@right-click-behavior e @->self))
+  (when-let [cb (get-in @->self [:morph :onClick])] 
+              (cb ->self)))
 
 ; morph property to CSS property translators
 

  {"borderColor" value
   "borderStyle" "solid"})

(defn get-border-radius-css [value])

(defn get-border-style-css [value])

(defn get-transform-css [{rotation :Rotation, scale :Scale, pivot :PivotPoint, 
                          :or {rotation 0, scale 1, pivot {:x 0, :y 0}}}]
  {html5TransformProperty (str "rotation(" rotation ") scale(" scale ")")
   html5TransformOriginProperty (str (:x pivot) "px " (:y pivot) "px")})

; translation from morph data to CSS style prop



(defn add-morph [->owner morph]
  (let [submorphs (or (get @->owner :submorphs) [])
        owned-morph (assoc morph :owner ->owner)]
    (om/update! ->owner :submorphs (conj submorphs owned-morph))
    ; we need to continue diving down the morph hierarchy and fix
    ; parent child refs as these could have been defined in
    ; the model previously but not yet materialized
    (when-let [submorphs ()])))

(defn remove-morph [->owner morph-id]
  (let [submorphs (get @->owner :submorphs)]
