     self = this
     @estraverse().replace root,
       enter: (node, parent) ->
+        console.log "#{node.type}"
         fn = self["#{node.type}"]
         fn.apply(self, [ node, parent, (=> @skip()), (=> @break()) ]) if fn
       leave: (node, parent) ->
+        console.log "#{node.type}Exit"
         fn = self["#{node.type}Exit"]
         fn.apply(self, [ node, parent, (=> @skip()), (=> @break()) ]) if fn
     root

          type: 'FunctionExpression'
          params: node.params
          body: node.body
    { type: 'EmptyStatement' }

  removeEmptyStatementsFromBody: (node) ->
    node.body = node.body.filter (n) ->

    @addExplicitUndefinedInitializer node, parent, skip

  consolidateBodies: (node) ->
    if node._prebody
      node.body = node._prebody.concat(node.body)
      delete node._prebody

  moveDeclarationToTopOfScope: (node, parent) ->
    @block._prebody ?= []
    # @recurse node.body <- ??
    @block._prebody.push
      type: 'ExpressionStatement'
      expression:
        type: 'AssignmentExpression'
