void SetupRunOptions(TestExecutionOptions options)
    {
      // Gallio has an extremely flexible mechanism for defining test filters
      // For now I will just try to pick out tags that should be included or excluded
      var metaFilters = from filter in options.FilterSet.Rules
                        let rule = filter.Filter as Gallio.Model.Filters.MetadataFilter<Gallio.Model.Filters.ITestDescriptor>
                        where rule != null
                        select new { RuleType = filter.RuleType, Rule = rule };
      var tagFilters = from meta in metaFilters
                       let rule = meta.Rule
                       let value = rule.ValueFilter as Gallio.Model.Filters.EqualityFilter<string>
                       where value != null && rule.Key == "Tag"
                       group value.Comparand by meta.RuleType into g
                       select g;

      var includeTags = tagFilters.SingleOrDefault(g => g.Key == Gallio.Model.Filters.FilterRuleType.Inclusion) ?? Enumerable.Empty<string>();
      var excludeTags = tagFilters.SingleOrDefault(g => g.Key == Gallio.Model.Filters.FilterRuleType.Exclusion) ?? Enumerable.Empty<string>();

      _options = new RunOptions(includeTags, excludeTags, new string[0]);
    }
 private Controller(Action<string> listenCallback, RunOptions runOptions)
 {
     _listener = new ControllerRunListener(listenCallback);
     _explorer = new AssemblyExplorer();
     _runner = new DefaultRunner(_listener, runOptions, signalRunStartAndEnd: false);
 }