docs: List<String> generate()
      {
          List<String> lines = Lists.newArrayList();
          StringBuilder workStr = new StringBuilder();
  
          List<AtomicInteger> columnWidths = getColumnWidths();
          List<Iterator<String>> dataIterators = getDataIterators();
  
          Iterator<AtomicInteger> columnWidthIterator = columnWidths.iterator();
          for ( String columnName : columnNames )
          {
              int thisWidth = columnWidthIterator.next().intValue();
              printValue(workStr, columnName, thisWidth);
          }
          pushLine(lines, workStr);
  
          boolean done = false;
          while ( !done )
          {
              boolean hadValue = false;
              Iterator<Iterator<String>> rowIterator = dataIterators.iterator();
              for ( AtomicInteger width : columnWidths )
              {
                  Iterator<String> thisDataIterator = rowIterator.next();
                  if ( thisDataIterator.hasNext() )
                  {
                      hadValue = true;
  
                      String value = thisDataIterator.next();
                      printValue(workStr, value, width.intValue());
                  }
                  else
                  {
                      printValue(workStr, "", width.intValue());
                  }
              }
              pushLine(lines, workStr);
  
              if ( !hadValue )
              {
                  done = true;
              }
          }
  
          return lines;
      }