   type: 'Call'
 
   constructor: (variable, args) ->
-    @children: flatten [@variable: variable, @args: (args or [])]
+    @is_new:   false
+    @is_super: variable is 'super'
+    @variable: if @is_super then null else variable
+    @children: compact flatten [@variable, @args: (args or [])]
     @compile_splat_arguments: SplatNode.compile_mixed_array <- @, @args
-    @is_new: false
 
   # Tag this invocation as creating a new instance.
   new_instance: ->

    idt += TAB while num -= 1
    idt

  # construct a node that returns the current node's result
  # note that this is overridden for smarter behaviour for
  # many statement nodes (eg IfNode, ForNode)
  make_return: ->
    if @is_statement()
      throw new Error("Can't convert statement ${this} into a return value!")
    return new ReturnNode(this)

  # Does this node, or any of its children, contain a node of a certain kind?
  # Recursively traverses down the *children* of the nodes, yielding to a block

    @variable instanceof ValueNode

  make_return: ->
    return new Expressions [this, new ReturnNode(@variable)]

  is_statement: ->
    @is_value() and (@variable.is_array() or @variable.is_object())
