class ResilientActionExecutor {

	public R executeResilient(ActionWhichShallBeResilient<R> action) throws Exception {
		Objects.requireNonNull(action, "action may not be null!");

		fallThroughSupport.handleFallThrough();

		ResilienctActionContext context = new ResilienctActionContext();
		R result = null;
		do {
			/* try to execute */
			try {
				result = action.execute();
			} catch (Exception e) {
				handleException(context, e);
			}

		} while (result == null && context.isRetryNecessary());

		return result;
	}

}