docs: public static void executeCellProcessors(final List<Object> destination, final List<?> source,
  		final CellProcessor[] processors, final int lineNo, final int rowNo) {
  		
  		if( destination == null ) {
  			throw new NullPointerException("destination should not be null");
  		} else if( source == null ) {
  			throw new NullPointerException("source should not be null");
  		} else if( processors == null ) {
  			throw new NullPointerException("processors should not be null");
  		}
  		
  		// the context used when cell processors report exceptions
  		final CsvContext context = new CsvContext(lineNo, rowNo, 1);
  		context.setRowSource(new ArrayList<Object>(source));
  		
  		if( source.size() != processors.length ) {
  			throw new SuperCsvException(String.format(
  				"The number of columns to be processed (%d) must match the number of CellProcessors (%d): check that the number"
  					+ " of CellProcessors you have defined matches the expected number of columns being read/written",
  				source.size(), processors.length), context);
  		}
  		
  		destination.clear();
  		
  		for( int i = 0; i < source.size(); i++ ) {
  			
  			context.setColumnNumber(i + 1); // update context (columns start at 1)
  			
  			if( processors[i] == null ) {
  				destination.add(source.get(i)); // no processing required
  			} else {
  				destination.add(processors[i].execute(source.get(i), context)); // execute the processor chain
  			}
  		}
  	}