class BinaryExceptionClassifierBuilder {

	/**
	 * Building notation type (white list or black list) - null: has not selected yet -
	 * true: white list - false: black list
	 */
	private Boolean isWhiteList = null;

	private boolean traverseCauses = false;

	private final List<Class<? extends Throwable>> exceptionClasses = new ArrayList<>();

	public BinaryExceptionClassifierBuilder retryOn(Class<? extends Throwable> throwable) {
		Assert.isTrue(isWhiteList == null || isWhiteList, "Please use only retryOn() or only notRetryOn()");
		Assert.notNull(throwable, "Exception class can not be null");
		isWhiteList = true;
		exceptionClasses.add(throwable);
		return this;

	}

	public BinaryExceptionClassifierBuilder notRetryOn(Class<? extends Throwable> throwable) {
		Assert.isTrue(isWhiteList == null || !isWhiteList, "Please use only retryOn() or only notRetryOn()");
		Assert.notNull(throwable, "Exception class can not be null");
		isWhiteList = false;
		exceptionClasses.add(throwable);
		return this;
	}

	public BinaryExceptionClassifierBuilder traversingCauses() {
		this.traverseCauses = true;
		return this;
	}

	public BinaryExceptionClassifier build() {<FILL_FUNCTION_BODY>}

}

		Assert.isTrue(!exceptionClasses.isEmpty(),
				"Attempt to build classifier with empty rules. To build always true, or always false "
						+ "instance, please use explicit rule for Throwable");
		BinaryExceptionClassifier classifier = new BinaryExceptionClassifier(exceptionClasses, isWhiteList // using
																											// white
																											// list
																											// means
																											// classifying
																											// provided
																											// classes
																											// as
																											// "true"
																											// (is
																											// retryable)
		);
		classifier.setTraverseCauses(traverseCauses);
		return classifier;
	
<no_super_class>