docs: @Override
      public Object render(Map<String, Object> context, LNode... nodes) {
  
          String valueName = super.asString(nodes[0].render(context));
          Object[] collection = super.asArray(nodes[1].render(context));
          LNode block = nodes[2];
          Map<String, Integer> attributes = getAttributes(collection, 3, context, nodes);
  
          int cols = attributes.get(COLS);
          int limit = attributes.get(LIMIT);
  
          Map<String, Object> tablerowloopContext = new HashMap<String, Object>();
  
          tablerowloopContext.put(LENGTH, collection.length);
  
          context.put(TABLEROWLOOP, tablerowloopContext);
  
          StringBuilder builder = new StringBuilder();
  
          int total = Math.min(collection.length, limit);
  
          if(total == 0) {
  
              builder.append("<tr class=\"row1\">\n</tr>\n");
          }
          else {
  
              for(int i = 0, c = 1, r = 0; i < total; i++, c++) {
  
                  context.put(valueName, collection[i]);
  
                  tablerowloopContext.put(INDEX0, i);
                  tablerowloopContext.put(INDEX, i + 1);
                  tablerowloopContext.put(RINDEX0, total - i - 1);
                  tablerowloopContext.put(RINDEX, total - i);
                  tablerowloopContext.put(FIRST, i == 0);
                  tablerowloopContext.put(LAST, i == total - 1);
                  tablerowloopContext.put(COL0, c - 1);
                  tablerowloopContext.put(COL, c);
                  tablerowloopContext.put(COL_FIRST, c == 1);
                  tablerowloopContext.put(COL_LAST, c == cols);
  
                  if(c == 1) {
                      r++;
                      builder.append("<tr class=\"row").append(r).append("\">").append(r == 1 ? "\n" : "");
                  }
  
                  builder.append("<td class=\"col").append(c).append("\">");
                  builder.append(super.asString(block.render(context)));
                  builder.append("</td>");
  
                  if(c == cols || i == total - 1) {
                      builder.append("</tr>\n");
                      c = 0;
                  }
              }
          }
  
          context.remove(TABLEROWLOOP);
  
          return builder.toString();
      }