class Cucumber::Runtime

def filters

def filters
  tag_expressions = @configuration.tag_expressions
  name_regexps = @configuration.name_regexps
  tag_limits = @configuration.tag_limits
  [].tap do |filters|
    filters << Filters::TagLimits.new(tag_limits) if tag_limits.any?
    filters << Cucumber::Core::Test::TagFilter.new(tag_expressions)
    filters << Cucumber::Core::Test::NameFilter.new(name_regexps)
    filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
    filters << Filters::Randomizer.new(@configuration.seed) if @configuration.randomize?
    # TODO: can we just use Glue::RegistryAndMore's step definitions directly?
    step_match_search = StepMatchSearch.new(@support_code.registry.method(:step_matches), @configuration)
    filters << Filters::ActivateSteps.new(step_match_search, @configuration)
    @configuration.filters.each { |filter| filters << filter }
    unless configuration.dry_run?
      filters << Filters::ApplyAfterStepHooks.new(@support_code)
      filters << Filters::ApplyBeforeHooks.new(@support_code)
      filters << Filters::ApplyAfterHooks.new(@support_code)
      filters << Filters::ApplyAroundHooks.new(@support_code)
      filters << Filters::BroadcastTestRunStartedEvent.new(@configuration)
      filters << Filters::Quit.new
    end
    filters << Filters::BroadcastTestCaseReadyEvent.new(@configuration)
    unless configuration.dry_run?
      filters << Filters::Retry.new(@configuration)
      # need to do this last so it becomes the first test step
      filters << Filters::PrepareWorld.new(self)
    end
  end
end