public SpecInfo Run(SpecInfo spec, MessageFormatter formatter)
        {
            var givenSteps = new StepInfo[_given.Count];

            for (int i = 0; i < _given.Count; i++)
            {
                var given = _given[i];
                int i1 = i;
                given.DescribeTo(s =>
                {
                    var stepInfo = new StepInfo(s);
                    givenSteps[i1] = stepInfo;
                    return spec.ReportGivenStep(stepInfo);
                }, formatter);
            }

            var prepareStep = new StepInfo("Setup completed");
            spec.ReportGivenStep(prepareStep);

            _when.DescribeTo(spec.ReportWhenStep, formatter);

            var token = new CancellationTokenSource();

            var events = new List<object>();

            try
            {
                //wireup
                Action<object> sink = events.Add;

                var router = _wireup(sink);

                if (_given.Count == 0)
                {
                    var step = new StepInfo("No history");
                    spec.ReportGivenStep(step);
                    step.Pass();
                }
                else for (int i = 0; i < _given.Count; i++)
                {
                    var g = _given[i];
                    g.RunTo(router);
                    givenSteps[i].Pass();
                }

                events.Clear();
                prepareStep.Pass();

                //run when
                _when.RunTo(router);
                spec.When.Pass();
            }
            catch
            {
                _expectations.DescribeTo(spec, formatter);
                throw;
            }
            finally
            {
                token.Cancel();
            }

            //then
            _expectations.Verify(events.ToArray(), spec, formatter);

            return spec;
        }