     @object:  !!source.object
     [@name, @index]: [@index, @name] if @object
     @children: compact [@body, @source, @filter]
-    @do_return: false
+    @returns: false
 
   top_sensitive: ->
     true
 
   make_return: ->
-    @do_return: true
-    this
-
-  compile_return_value: (retvar, o) ->
-    if @do_return
-      return new ReturnNode(literal(retvar)).compile(o)
-    else
-      return retvar or ''
+    @returns: true
+    this
+
+  compile_return_value: (val, o) ->
+    return new ReturnNode(literal(val)).compile(o) if @returns
+    val or ''
 
   # Welcome to the hairiest method in all of CoffeeScript. Handles the inner
   # loop, filtering, stepping, and result saving for array, object, and range
   # comprehensions. Some of the generated code can be shared in common, and
   # some cannot.
   compile_node: (o) ->
-    top_level:      del(o, 'top') and not @do_return
+    top_level:      del(o, 'top') and not @returns
     range:          @source instanceof ValueNode and @source.base instanceof RangeNode and not @source.properties.length
     source:         if range then @source.base else @source
     scope:          o.scope

  type: 'Call'

  constructor: (variable, args) ->
    @children: flatten [@variable: 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: ->

    @has_properties() and @properties[@properties.length - 1] instanceof SliceNode

  make_return: ->
    if @has_properties() then super() else @base.make_return()

  # The value can be unwrapped as its inner node, if there are no attached
  # properties.
