text: 'use strict';
  
  var Node = require('./Node');
  
  class SelfInvokingFunction extends Node {
      constructor(def) {
          super('SelfInvokingFunction');
          this.params = def.params;
          this.args = def.args;
          this.body = this.makeContainer(def.body);
      }
  
      generateCode(codegen) {
          var params = this.params || [];
          var args = this.args || [];
          var body = this.body;
  
          codegen.write('(');
          var functionDeclaration = codegen.builder.functionDeclaration(null, params, body);
          var functionCall = codegen.builder.functionCall(functionDeclaration, args);
          codegen.generateCode(functionCall);
  
          codegen.write(')');
      }
  
      walk(walker) {
          this.params = walker.walk(this.params);
          this.args = walker.walk(this.args);
          this.body = walker.walk(this.body);
      }
  }
  
  module.exports = SelfInvokingFunction;