   # This is what `coffee --nodes` prints out.
   toString: (idt) ->
     idt: or ''
-    '\n' + idt + @constructor_name + (child.toString(idt + TAB) for child in @children()).join('')
-
-  children: ->
+    '\n' + idt + @type + (child.toString(idt + TAB) for child in @collect_children()).join('')
+
+  each_child: (func) ->
+    return unless @children
+    for attr in @children when this[attr]
+      for child in flatten [this[attr]]
+        return if func(child) is false
+
+  collect_children: ->
     nodes: []
     @each_child (node) -> nodes.push node
     nodes
-
-  each_child: (func) ->
-    return unless @children_attributes
-    for attr in @children_attributes when this[attr]
-      for child in flatten [this[attr]]
-        return if func(child) is false
 
   traverse_children: (cross_scope, func) ->
     @each_child (child) ->

# The CoffeeScript class definition.
exports.ClassNode: class ClassNode extends BaseNode

  # Initialize a **ClassNode** with its name, an optional superclass, and a
  # list of prototype property assignments.
  constructor: (variable, parent, props) ->
    super {name: 'ClassNode', is_statement: yes, children: ['variable', 'parent', 'properties']}
    @variable: variable
    @parent: parent
    @properties: props or []

# make sense.
exports.ReturnNode: class ReturnNode extends BaseNode

  type:               'ReturnNode'
  is_statement:       -> yes
  is_pure_statement:  -> yes
  children:           ['expression']

  constructor: (expression) ->
    @expression: expression

  top_sensitive: ->
