   (-vdom-node [this]
     (.ensureNode this)
     node)
-  (-vdom-element [this] this)
+  (-vdom-simple-element [this] this)
   (-vdom-insert [this dom-parent dom-before]
     (.ensureNode this)
     (dom-insert dom-parent node dom-before))
   (-vdom-remove [this]
     (dom-remove node))
   (-vdom-replace [this new-vdom]
-    (if-let [new-elem (vdom-element new-vdom)]
+    (if-let [new-elem (vdom-simple-element new-vdom)]
       (if (instance? DOMTextNode new-vdom)
         (do
           (.ensureNode this)

          new-vdom))
      (dom-remove-replace node new-vdom))))

(deftype ReactiveElement [id ^:mutable parent the-ref binding-info ^:mutable cur-vdom ^:mutable dirty
                          ^:mutable updating ^:mutable disposed]
  Object
  (dispose [this]

  (-vdom-node [this]
    (.ensureNode this)
    node)
  (-vdom-simple-element [this] this)
  (-vdom-insert [this dom-parent dom-before]
    (.ensureNode this)
    (dom-insert dom-parent node dom-before))
  (vdom-remove [this]
    (dom-remove node))
  (-vdom-replace [this new-vdom]
    (if-let [new-elem (vdom-simple-element new-vdom)]
      (if (and (instance? DOMElement new-elem)
               (identical? (.-ns-uri new-elem) ns-uri)
               (identical? (.-tag new-elem) tag)
               false ;; disabled
               )
        (do
          ;; TODO do diff replace
          this)
