class Runner

def initialize
  self.specs = []
  self.halt = false
  self.stopped = false
  self.bail = false
  self.tag = ''
end

defm set_bail(bail)
  self.bail = bail
end

defm get_bail
  return self.bail
end

defm set_tag(tag)
  self.tag = tag
end

defm get_tag
  return self.tag
end

defm add(spec)
  add(self.specs, spec)
  return spec
end

defm start(reporter, stats)
  reporter.on_start(stats)

  timer = new SpecTimer()
  timer.start()

  for spec in self.specs
    if self.stopped
      break
    end

    spec_runner = new SpecRunner(spec)
    spec_runner.set_bail(self.get_bail())
    spec_runner.set_tag(self.get_tag())
    spec_runner.start(reporter, stats)

    if spec_runner.has_bailed()
      self.stopped = true
    end
  end

  timer.stop()
  reporter.on_end(timer.get_duration(), stats)
end

defm stop
  self.stopped = true
end

end