@Override
	public <T> T run(Supplier<T> toRun, Function<Throwable, T> fallback) {
		Supplier<T> toRunDecorator = decorator.decorateSupplier(toRun);
		try {
			return toRunDecorator.get();
		}
		catch (CallAbortedException e) {
			LOGGER.debug("PolarisCircuitBreaker CallAbortedException: {}", e.getMessage());
			PolarisCircuitBreakerUtils.reportStatus(consumerAPI, conf, e);
			return fallback.apply(e);
		}
		catch (Exception e) {
			return fallback.apply(e);
		}
	}
@Test
	public void run() {
		this.contextRunner.run(context -> {

			PolarisCircuitBreakerFactory polarisCircuitBreakerFactory = context.getBean(PolarisCircuitBreakerFactory.class);
			CircuitBreaker cb = polarisCircuitBreakerFactory.create(SERVICE_CIRCUIT_BREAKER);

			PolarisCircuitBreakerConfigBuilder.PolarisCircuitBreakerConfiguration configuration =
					polarisCircuitBreakerFactory.configBuilder(SERVICE_CIRCUIT_BREAKER).build();

			polarisCircuitBreakerFactory.configureDefault(id -> configuration);

			assertThat(cb.run(() -> "foobar")).isEqualTo("foobar");

			assertThat((String) cb.run(() -> {
				throw new RuntimeException("boom");
			}, t -> "fallback")).isEqualTo("fallback");

		});
	}