 
 (deftype Reaction [f ^:mutable state ^:mutable ^number dirtyness
                    ^:mutable watching ^:mutable watches
-                   auto-run on-set on-dispose ^:mutable ^boolean norun?
-                   ^boolean nocache?]
+                   ^:mutable auto-run on-set on-dispose ^boolean nocache?]
   IAtom
   IReactiveAtom
 

    (reduce-kv (fn [_ key f]
                 (f key this oldval newval)
                 nil)
               nil watches))

  (-add-watch [this key f]
    (set! watches (check-watches watches (assoc watches key f))))


  (-check-clean [this]
    (when (== dirtyness maybe-dirty)
      (let [ar auto-run]
        ;; TODO: try/catch
        (set! auto-run nil)
        (doseq [w watching]
          (when (and (instance? Reaction w)
                     (not (-check-clean w)))
            (if-some [ar (.-auto-run w)]
              (ar w)
              (run w))))
        (set! auto-run ar))
      (when (== dirtyness maybe-dirty)
        (set! dirtyness clean)))
    (== dirtyness clean))
