 
 ; utilities
 
-(defn render-submorphs [app]
+(defn add-points [point & points]
+  (reduce (fn [p1 p2] {:x (+ (p1 :x) (p2 :x)) :y (+ (p1 :y) (p2 :y))}) point points))
+
+(defn is-visible [morph]
+  (let [visible (get-in morph [:morph :Visible])]
+    (if (nil? visible)
+      true
+      visible)))
+
+(defn render-submorphs [self]
   (dom/div #js {:className "originNode"}
     (apply dom/div nil
-      (om/build-all morph (get app :submorphs) {:state {:owner-morph app}}))))
+      (om/build-all morph (get self :submorphs) {:state {:owner-morph self}}))))
 
 ; property accessors
-
+    
 (defn find-morph-path
-  ([morph-model id] 
-    (if (contains? morph-model :coll) ; this is a hack to work with om-sync applied
+ ([morph-model id] 
+  (if (contains? morph-model :coll) ; this is a hack to work with om-sync applied
       (into [:coll] (find-morph-path (morph-model :coll) id []))
       (into [] (find-morph-path morph-model id []))))
   ([morph-model id path]

  (let [style (extract-shape-css app)]
    ;; we apply some customizations to the style, to make the shape elliptical
    (let [ellipse-style (assoc style 
                          "border-radius" (str (style "width") " /" (style "height")))]
      (dom/div #js {:style (dict->js ellipse-style)} (render-submorphs app)))))

(defmethod shape :default [app owner]

(defn get-text-color-css [color]
  {"textColor" color})

(defn get-prevent-selection-css [value]
  (when (false? value) {"-webkit-user-select" "none"}))

(defn extract-text-css [->self]
     (apply merge 
       (map (fn [[prop value]]               
