   else
     new Source(s, true, true)
 
-describe = (context, desc, args...) -> 
-  if context instanceof Desc
-    context
-  else if desc instanceof Desc
-    desc
+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

        [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

  fmap: -> this
  apply: -> this
  toString: -> "<error> #{@error}"

class Observable
  constructor: (desc) ->
