docs: function (loop, variables) {
      var variable = false;
      try {
          variable = varsParser.evaluate('(' + loop.variable + ')', variables);
      } catch (err) {
          throw new Error('Error executing loop expression: ' + loop.variable + ' <' + err.message + '>');
      }
  
      var html = '';
      var loopVariables = _.clone(variables, true);
  
      (function (iterate) {
          if (Array.isArray(variable)) {
              for (var i = 0, l = variable.length; i < l; i++) {
                  iterate(i, variable[i]);
              }
          } else {
              for (var i in variable) {
                  if (!variable.hasOwnProperty(i)) {
                      continue;
                  }
                  iterate(i, variable[i]);
              }
          }
      })(function (key, value) {
          loopVariables.$key = loopVariables[loop.keyName] = key;
          loopVariables.$value = loopVariables[loop.valueName] = value;
  
          var loopHtml = loop.content;
  
           //<if/> (condicionais, execução das condicionais para geração do template)
          loopHtml = conditionalParser(loopHtml, loopVariables);
  
          loop.children.forEach(function (child) {
              loopHtml = loopHtml.replace(child.mark, proccessLoop(child, loopVariables));
          });
  
          // #{vars} (escapando as variaveis no template)
          loopHtml = varsParser.escapeValues(loopHtml, loopVariables);
  
          html += loopHtml;
      });
  
      return html;
  }