class Experiment {

    void callSelfHealing () {
        int selfHealingAttempts = getSelfHealingCounter().get();
        try {
            if (canRunSelfHealing()) {
                selfHealingAttempts = getSelfHealingCounter().incrementAndGet();
                log.info("Running self healing for the {} time", selfHealingAttempts);
                sendNotification(NotificationLevel.WARN, "Running self healing for the " + selfHealingAttempts + " time.");
                lastSelfHealingTime = Instant.now();
                selfHealingMethod.run();
            }
        } catch (Exception e) {
            sendNotification(NotificationLevel.ERROR, AN_EXCEPTION_OCCURRED_WHILE_RUNNING_SELF_HEALING);
            log.error("An error occurred while calling self healing method", e);
        } finally {
            evaluateRunningExperiment();
            if (selfHealingAttempts >= DEFAULT_MAXIMUM_SELF_HEALING_RETRIES && getExperimentState().equals(ExperimentState.SELF_HEALING)) {
                sendNotification(NotificationLevel.ERROR, MAXIMUM_SELF_HEALING_RETRIES_REACHED);
                setExperimentState(ExperimentState.FAILED);
            }
        }
    }

    public  Experiment(Container container);

}