class Cucumber::Cli::Main

def configuration

def configuration
  @configuration ||= Configuration.new(@out, @err).tap do |configuration|
    configuration.parse!(@args)
    Cucumber.logger = configuration.log
  end
end

def execute(args)

def execute(args)
  new(args).execute!
end

def execute!(existing_runtime = nil)

def execute!(existing_runtime = nil)
  trap_interrupt
  runtime = runtime(existing_runtime)
  runtime.run!
  if Cucumber.wants_to_quit
    exit_unable_to_finish
  elsif runtime.failure?
    exit_tests_failed
  else
    exit_ok
  end
rescue SystemExit => e
  @kernel.exit(e.status)
rescue FileNotFoundException => e
  @err.puts(e.message)
  @err.puts("Couldn't open #{e.path}")
  exit_unable_to_finish
rescue FeatureFolderNotFoundException => e
  @err.puts("#{e.message}. You can use `cucumber --init` to get started.")
  exit_unable_to_finish
rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
  @err.puts(e.message)
  exit_unable_to_finish
rescue Errno::EACCES, Errno::ENOENT => e
  @err.puts("#{e.message} (#{e.class})")
  exit_unable_to_finish
rescue Exception => e
  @err.puts("#{e.message} (#{e.class})")
  @err.puts(e.backtrace.join("\n"))
  exit_unable_to_finish
end

def exit_ok

def exit_ok
  @kernel.exit 0
end

def exit_tests_failed

def exit_tests_failed
  @kernel.exit 1
end

def exit_unable_to_finish

def exit_unable_to_finish
  @kernel.exit 2
end

def exit_unable_to_finish!

stops the program immediately, without running at_exit blocks
def exit_unable_to_finish!
  @kernel.exit! 2
end

def initialize(args, out = $stdout, err = $stderr, kernel = Kernel)

def initialize(args, out = $stdout, err = $stderr, kernel = Kernel)
  @args   = args
  @out    = out
  @err    = err
  @kernel = kernel
end

def runtime(existing_runtime)

def runtime(existing_runtime)
  return Runtime.new(configuration) unless existing_runtime
  existing_runtime.configure(configuration)
  existing_runtime
end

def trap_interrupt

def trap_interrupt
  trap('INT') do
    exit_unable_to_finish! if Cucumber.wants_to_quit
    Cucumber.wants_to_quit = true
    $stderr.puts "\nExiting... Interrupt again to exit immediately."
    exit_unable_to_finish
  end
end