'Runs a scenario, running each of its steps. Also call
before_each and after_each callbacks for steps and scenario'

def run(self, ignore_case, failfast=False):

    results = []
    call_hook('before_each', 'scenario', self)
    def run_scenario(almost_self, order=(-1), outline=None, run_callbacks=False):
        try:
            if outline:
                self._report_outline_hook(outline, True)
            if self.background:
                self.background.run(ignore_case)
            reasons_to_fail = []
            (all_steps, steps_passed, steps_failed, steps_undefined) = Step.run_all(self.steps, outline, run_callbacks, ignore_case, failfast=failfast, display_steps=(order < 1), reasons_to_fail=reasons_to_fail)
        except:
            if outline:
                self._report_outline_hook(outline, False)
            call_hook('after_each', 'scenario', self)
            raise
        finally:
            if outline:
                call_hook('outline', 'scenario', self, order, outline, reasons_to_fail)
        if outline:
            self._report_outline_hook(outline, False)
        skip = (lambda x: ((x not in steps_passed) and (x not in steps_undefined) and (x not in steps_failed)))
        steps_skipped = filter(skip, all_steps)
        return ScenarioResult(self, all_steps, steps_passed, steps_failed, steps_skipped, steps_undefined, outline)
    if self.outlines:
        for (index, outline) in enumerate(self.outlines):
            results.append(run_scenario(self, index, outline, run_callbacks=True))
    else:
        results.append(run_scenario(self, run_callbacks=True))
    call_hook('after_each', 'scenario', self)
    return results
