class CompositeItemProcessorBuilder<I, O> {

	private List<? extends ItemProcessor<?, ?>> delegates;

	/**
	 * Establishes the {@link ItemProcessor} delegates that will work on the item to be
	 * processed.
	 * @param delegates list of {@link ItemProcessor} delegates that will work on the
	 * item.
	 * @return this instance for method chaining.
	 * @see CompositeItemProcessor#setDelegates(List)
	 */
	public CompositeItemProcessorBuilder<I, O> delegates(List<? extends ItemProcessor<?, ?>> delegates) {
		this.delegates = delegates;

		return this;
	}

	/**
	 * Establishes the {@link ItemProcessor} delegates that will work on the item to be
	 * processed.
	 * @param delegates the {@link ItemProcessor} delegates that will work on the item.
	 * @return this instance for method chaining.
	 * @see CompositeItemProcessorBuilder#delegates(List)
	 */
	public CompositeItemProcessorBuilder<I, O> delegates(ItemProcessor<?, ?>... delegates) {
		return delegates(Arrays.asList(delegates));
	}

	/**
	 * Returns a fully constructed {@link CompositeItemProcessor}.
	 * @return a new {@link CompositeItemProcessor}
	 */
	public CompositeItemProcessor<I, O> build() {<FILL_FUNCTION_BODY>}

}

		Assert.notNull(delegates, "A list of delegates is required.");
		Assert.notEmpty(delegates, "The delegates list must have one or more delegates.");

		CompositeItemProcessor<I, O> processor = new CompositeItemProcessor<>();
		processor.setDelegates(this.delegates);
		return processor;
	
<no_super_class>