         ref = new Literal o.scope.freeVariable 'ref'
         fst = new Parens new Assign ref, fst
         snd.base = ref
-      ifn = new If new Existence(fst), snd, operation: yes
-      ifn.soakNode = on
+      ifn = new If new Existence(fst), snd, soak: yes
       return ifn
     null
 
   # Unfold a node's child if soak, then tuck the node under created `If`
   @unfoldSoak: (o, parent, name) ->
-    node = parent[name]
-    if node instanceof If and node.soakNode
-      ifnode = node
-    else if node instanceof Value
-      ifnode = node.unfoldSoak o
-    return unless ifnode
-    parent[name] = ifnode.body
-    ifnode.body = new Value parent
-    ifnode
+    return unless ifn = parent[name].unfoldSoak o
+    parent[name] = ifn.body
+    ifn.body     = new Value parent
+    ifn
 
 #### Comment
 

  toString: (idt, override) ->
    idt or= ''
    children = (child.toString idt + TAB for child in @collectChildren()).join('')
    klass = override or @constructor.name + if @soakNode or @exist then '?' else ''
    '\n' + idt + klass + children

  eachChild: (func) ->

  # operators `?.` interspersed. Then we have to take care not to accidentally
  # evaluate a anything twice when building the soak chain.
  compileNode: (o) ->
    return ifn.compile o if ifn = @unfoldSoak o
    props = @properties
    @base.parenthetical = yes if @parenthetical and not props.length
    code = @base.compile o
