    (fn [f]
      (fn []
        (this-as this
-         (let [props (.. this -state -cljs$props)]
+         (let [props (get-in @component-state [this :props])]
            (update-subscriptions this props props)
            (when f
              (f this
                 props
-                (.. this -state -cljs$state)
-                (.. this -state -cljs$previousState)))))))
+                (get-in @component-state [this :state])
+                (get-in @component-state [this :prev-state])))))))
 
    "componentWillReceiveProps"
    (fn [f]
-     (fn [next-props]
-       (this-as this
-         (let [next-props (expand-props this (parse-props next-props))
-               prev-props (.. this -state -cljs$props)]
-           (doto (.-state this)
-             (gobj/set "cljs$previousProps" prev-props)
-             (gobj/set "cljs$props" next-props))
-           (binding [*trigger-state-render* false
-                     *use-prior-props* true]
-             (update-subscriptions this prev-props next-props)
-             (when f (f this prev-props next-props)))))))
+     (fn [props]
+       (let [next-props (.-cljs$props props)
+             next-children (.-cljs$children props)]
+         (this-as this
+           (let [next-props (expand-props this next-props)
+                 prev-props (get-in @component-state [this :props])]
+             (swap! component-state update this #(-> %
+                                                     (assoc :prev-props prev-props)
+                                                     (assoc :props next-props)
+                                                     (assoc :children next-children)))
+             (binding [*trigger-state-render* false
+                       *use-prior-props* true]
+               (update-subscriptions this prev-props next-props)
+               (when f (f this prev-props next-props))))))))
 
    "shouldComponentUpdate"
    (fn [f]

  [component name]
  (some-> (.-refs component) (gobj/get name)))



;; self-management of cljs props and state


         (when f (binding [*use-prior* true
                           *trigger-state-render* false]
                   (f this
                      (get-in @component-state [this :props])
                      (get-in @component-state [this :state])
                      (get-in @component-state [this :prev-props])
                      (get-in @component-state [this :prev-state])))))))

   "componentDidUpdate"
   (fn [f]
     (fn [_ _]
       (this-as this
         (f this
            (get-in @component-state [this :props])
            (get-in @component-state [this :state])
            (get-in @component-state [this :prev-props])
            (get-in @component-state [this :prev-state])))))

   "render"
   (fn [f]
     (fn []
       (this-as this
         (let [element (f this
                          (get-in @component-state [this :props])
                          (get-in @component-state [this :state]))]
           ;; wrap in sablono.core/html if not already a valid React element
           (if (js/React.isValidElement element)
             element
