docs: function(each){
      var ast = [];
      var indexVarName = each.key || 'pug_index' + this.eachCount;
      this.eachCount++;
  
  
      var body =  [
                    t.variableDeclaration('var', [
                      t.variableDeclarator(t.identifier('$$obj'), each.astObj || this.parseExpr(each.obj))
                    ])
                  ]
  
      var func =  t.expressionStatement(
                    this.wrapCallExpression(t.callExpression(
                      t.memberExpression(
                        t.functionExpression(
                          null,
                          [],
                          t.blockStatement(body),
                          this.useGenerators
                        ),
                        t.identifier('call')
                      )
                      ,[t.thisExpression()]
                    ))
                  )
      ast.push(func)
  
  
        var blockEach = [
          t.variableDeclaration('var', [
              t.variableDeclarator(t.identifier(each.val), t.memberExpression(t.identifier('$$obj'), t.identifier(indexVarName), true) )
          ])
        ];
        var blockAlt = [];
   
        push.apply(blockEach, this.visit(each.block, each));
        var arrayLoop = 
            t.blockStatement([t.forStatement(
              t.variableDeclaration('var', [
                t.variableDeclarator(t.identifier(indexVarName), t.numericLiteral(0)),
                t.variableDeclarator(t.identifier('$$l'), t.memberExpression(t.identifier('$$obj'), t.identifier('length')))
              ]),
              t.binaryExpression('<', t.identifier(indexVarName), t.identifier('$$l')),
              t.updateExpression('++', t.identifier(indexVarName), false),
              t.blockStatement(blockEach)
            )]);
  
  
        var blockObj = [
          t.expressionStatement(t.updateExpression('++', t.identifier('$$l'), false)),
          t.variableDeclaration('var', [
            t.variableDeclarator(t.identifier(each.val), t.memberExpression(t.identifier('$$obj'), t.identifier(indexVarName), true) )
          ])
        ]
        var blockObjAlt = [];
  
        push.apply(blockObj, this.visit(each.block, each));
        var objectLoop = t.blockStatement([
          t.variableDeclaration('var', [
            t.variableDeclarator(t.identifier('$$l'), t.numericLiteral(0))
          ]),
          t.forInStatement(
            t.variableDeclaration('var', [
              t.variableDeclarator(t.identifier(indexVarName))
            ]),
            t.identifier('$$obj'),
            t.blockStatement(blockObj)
          )
        ])
  
  
  
      if (each.alternate) {
        push.apply(blockAlt, this.visit(each.alternate, each));
        arrayLoop = t.ifStatement(
          t.memberExpression(t.identifier('$$obj'), t.identifier('length')),
          arrayLoop,
          t.blockStatement(blockAlt)
        );
     }
  
  
      if (each.alternate) {
        push.apply(blockObjAlt, this.visit(each.alternate, each));
        objectLoop.body.push(t.ifStatement(
              t.binaryExpression('===', t.identifier('$$l'), t.numericLiteral(0)),
              t.blockStatement(blockObjAlt)
        ))
      }
  
      var it = t.ifStatement(
          t.binaryExpression('==', t.stringLiteral('number'), t.unaryExpression('typeof', t.memberExpression(t.identifier('$$obj'), t.identifier('length')))),
          arrayLoop, objectLoop)
      body.push(it);
  
      return ast;
  
    }