public function run(DeltaInterface $version, OptionsInterface $options)
    {
        if (!$this->shouldMigrate($version, $options)) {
            if ($options->isExceptionOnSkip()) {
                throw new RunnerException(sprintf(
                    'Cowardly refusing to run %s() on a delta that is already "%s" (ID: %s).',
                    $options->getDirection(),
                    $options->getDirection(),
                    $version->getId()
                ));
            }

            return false; // skip
        }

        // Dispatch MIGRATE_BEFORE
        $this->getPublisher()->publish(new MigrateBeforeEvent($version, $options, $this->getContext()));

        $version->migrate($options); // state will be changed

        // Dispatch MIGRATE_AFTER
        $event = new MigrateAfterEvent($version, $options, $this->getContext());
        $this->getPublisher()->publish($event);

        return $event;
    }