       @options.filename,
       output)
 
-  ###
+  ###*
   # onUnknownNode():
   # Invoked when the node is not known. Throw an error.
   ###
 
   onUnknownNode: (node, ctx) ->
+    @unspported(node, ctx)
+
+  unsupported: (node, ctx) ->
     err = buildError({
       lineNumber: node.loc.start.line,
       column: node.loc.start.column,
       description: "#{ctx?.type} is not supported"
-    }, @source, @options.filename)
+    }, @options.source, @options.filename)
     throw err
 
   ###


js2coffee.parse = (source, options = {}) ->
  options.filename ?= 'input.js'

  try
    ast = Esprima.parse(source, loc: true, range: true, comment: true)
  catch err
    throw buildError(err, source, options.filename)

  builder = new Builder(ast, options, source)
  {code, map} = builder.get()

  {code, ast, map}

###*
# Builder : new Builder(ast, [options])
# (private) Generates output based on a JavaScript AST.
#
#     s = new Builder(ast, {})
#     s.get()
#     => { code: '...', map: { ... } }
###

class Builder extends Walker

  constructor: (ast, options={}, @source) ->
    super
    @_indent = 0


  get: ->
    @run().toStringWithSourceMap()

  ###*
  # decorator():
  # Takes the output of each of the node visitors and turns them into
  # a `SourceNode`.
  ###

  decorator: (node, output) ->
