   fmap: -> this
   apply: -> this
   toString: -> "<error> #{@error}"
-
-withDescription = (desc..., obs) ->
-  describe(desc...).apply(obs)
 
 class Observable
   constructor: (desc) ->

        [x]
      else
        []
    new Desc(findDeps(args), -> _.toString(context) + "." + _.toString(desc) + "(" + _.map(_.toString, args) + ")")


class Desc
  constructor: (@deps, @toString) ->
  apply: (obs) ->
    obs.deps = this.deps
    obs.toString = this.toString
    obs
    # TODO: add structural description
    # TODO: take advantage of the new "context" thingie

Bacon.when = (patterns...) ->
    return Bacon.never() if patterns.length == 0

  else
    new Source(s, true, true)

describe = (context, method, args...) -> 
  if (context || method) instanceof Desc
    context || method
  else
    new Desc(context, method, args)

class Desc
  constructor: (context, method, args) ->
    findDeps = (x) ->
      if isArray(x)
        _.flatMap findDeps, x
