code: @Override
  	public LINK_RESULT run(Object... args) {
  		
  		try {
  			
  			ProcessorChainLink<LINK_RESULT, LINK_FAILURE> current = root;
  			
  			LINK_RESULT result = onInitiate(current, args);
  			
  			while (!current.isTerminalLink()) {
  				
  				current = current.getSuccessor();
  				result = onTraverse(result, current, args);
  			} 
  			
  			onTerminate(result, args);
  			
  			return result;
  		}
  		catch(Exception e) { 
  			
  			throw new ChainExecutionException(e);
  		}
  	}
docs: <p>Directs processing along the chain by executing the root {@link ProcessorChainLink} and delegating
  all successors to {@link #onTraverse(Object, ProcessorChainLink, Object...)} and the terminal link to
  {@link #onTerminate(Object, Object...)}.</p>
  
  @param args
  the arguments to the root {@link ProcessorChainLink} which serves as the input to the first
  {@link Processor} which produces the initial <i>RESULT</i>; these are passed along the chain
  for each and every link
  <br><br>
  @return the result of the complete {@link AbstractProcessorChain} execution after being processed by
  {@link #onTerminate(Object, Object...)}
  <br><br>
  @throws ChainExecutionException
  if the {@link AbstractProcessorChain} halted due to an unrecoverable failure in one of its
  {@link ProcessorChainLink}s; this signals a <b>chain-wide</b> failure; failures of individual
  links may be handled in {@link #onInitiate(ProcessorChainLink, Object...)} and
  {@link #onTraverse(Object, ProcessorChainLink, Object...)}
  <br><br>
  @since 1.3.0