     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

    @consolidateBodies node
    @removeEmptyStatementsFromBody node
  FunctionDeclaration: (node, parent) ->
    @pushStack node.body
    @removeUndefinedParameter node
    @moveDeclarationToTopOfScope node, parent
  FunctionDeclarationExit: (node) ->
    @popStack()
  FunctionExpression: (node) ->

          type: 'FunctionExpression'
          params: node.params
          body: node.body

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