     idt ||= ''
     '\n' + idt + @type + (child.toString(idt + TAB) for child in @real_children()).join('')
 
-}
 
 # A splat, either as a parameter to a function, an argument to a call,
 # or in a destructuring assignment.
-SplatNode: exports.SplatNode: inherit BaseNode, {
+exports.SplatNode: class SplatNode extends BaseNode
   type: 'Splat'
 
   constructor: (name) ->
     name: new LiteralNode(name) unless name.compile
     @children: [@name: name]
-    this
 
   compile_node: (o) ->
     if @index? then @compile_param(o) else @name.compile(o)

  compile_value: (o, name, index) ->
    "Array.prototype.slice.call(" + name + ', ' + index + ')'

}

# A while loop, the only sort of low-level loop exposed by CoffeeScript. From
# it, all other loops can be manufactured.
WhileNode: exports.WhileNode: inherit BaseNode, {
  type: 'While'

  constructor: (condition, opts) ->
    @children:[@condition: condition]
    @filter: opts and opts.filter
    this

  add_body: (body) ->
    @children.push @body: body

    @object:  !!source.object
    [@name, @index]: [@index, @name] if @object
    @children: compact [@body, @source, @filter]

  top_sensitive: ->
    true
