 
   withDescription: ->
     describe(arguments...).apply(this)
+
+  dependsOn: (observable) ->
+    DepCache.dependsOn(this, observable)
 
 Observable :: reduce = Observable :: fold
 Observable :: assign = Observable :: onValue

    else
      f()
  independent = (waiter) ->
    !_.any(waiters, ((other) -> waiter.obs.dependsOn(other.obs)))

  whenDoneWith = (obs, f) ->
    if rootEvent

DepCache = (->
  flatDeps = {}
  
  dependsOn = (orig, o) ->
    myDeps = flatDeps[orig.id]
    if !myDeps
      myDeps = flatDeps[orig.id] = {}
      collectDeps orig, orig
    myDeps[o.id]
  
  collectDeps = (orig, o) ->
    for dep in o.internalDeps()
