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


    deps = _.cached (-> findDeps([that.context].concat(that.args)))
    obs.internalDeps = obs.internalDeps || deps
    obs.dependsOn = DepCache.dependsOn
    obs.deps = deps

    obs.toString = (-> _.toString(that.context) + "." + _.toString(that.method) + "(" + _.map(_.toString, that.args) + ")")

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()
