public function verify(ExerciseInterface $exercise, Input $input)
    {
        $exercise->configure($this);

        $runner = $this->runnerManager->getRunner($exercise);

        foreach ($runner->getRequiredChecks() as $requiredCheck) {
            $this->requireCheck($requiredCheck);
        }

        $this->eventDispatcher->dispatch(new ExerciseRunnerEvent('verify.start', $exercise, $input));

        $this->validateChecks($this->checksToRunBefore, $exercise);
        $this->validateChecks($this->checksToRunAfter, $exercise);

        foreach ($this->checksToRunBefore as $check) {
            $this->results->add($check->check($exercise, $input));

            if (!$this->results->isSuccessful()) {
                return $this->results;
            }
        }

        $this->eventDispatcher->dispatch(new ExerciseRunnerEvent('verify.pre.execute', $exercise, $input));

        try {
            $this->results->add($runner->verify($input));
        } finally {
            $this->eventDispatcher->dispatch(new ExerciseRunnerEvent('verify.post.execute', $exercise, $input));
        }

        foreach ($this->checksToRunAfter as $check) {
            $this->results->add($check->check($exercise, $input));
        }

        $this->eventDispatcher->dispatch(new ExerciseRunnerEvent('verify.post.check', $exercise, $input));
        $exercise->tearDown();

        $this->eventDispatcher->dispatch(new ExerciseRunnerEvent('verify.finish', $exercise, $input));
        return $this->results;
    }