     this
 
   compile_node: (o) ->
+    o.chain_root.wrapped: or @soak_node
     proto_part: if @prototype then 'prototype.' else ''
     ".$proto_part${@name.compile(o)}"
 

    @soak_node: tag is 'soak'

  compile_node: (o) ->
    idx: @index.compile o
    "[$idx]"


  # operators `?.` interspersed. Then we have to take care not to accidentally
  # evaluate a anything twice when building the soak chain.
  compile_node: (o) ->
    only:         del(o, 'only_first')
    op:           del(o, 'operation')
    props:        if only then @properties[0...@properties.length - 1] else @properties
    o.chain_root: this unless o.chain_root
    baseline:     @base.compile o
    baseline:     "($baseline)" if @base instanceof ObjectNode and @has_properties()
    complete:     @last: baseline

    for prop in props
      @source: baseline
      if prop.soak_node
        if @base instanceof CallNode and prop is props[0]
          temp: o.scope.free_variable()
          complete: "($temp = $complete)$@SOAK" + (baseline: temp + prop.compile(o))
