class Covered::Config

def self.coverage

def self.coverage
	ENV['COVERAGE']
end

def self.load(root: self.root, coverage: self.coverage)

def self.load(root: self.root, coverage: self.coverage)
	derived = Class.new(self)
	
	if path = self.path(root)
		config = Module.new
		config.module_eval(::File.read(path), path)
		derived.prepend(config)
	end
	
	return derived.new(root, coverage)
end

def self.path(root)

def self.path(root)
	path = ::File.expand_path(PATH, root)
	
	if ::File.exist?(path)
		return path
	end
end

def self.root

def self.root
	ENV['COVERED_ROOT'] || Dir.pwd
end

def autostart!

def autostart!
	if rubyopt = ENV['RUBYOPT'] and !rubyopt.empty?
		rubyopt = [rubyopt.strip, REQUIRE_COVERED_AUTOSTART].join(' ')
	else
		rubyopt = REQUIRE_COVERED_AUTOSTART
	end
	
	ENV['RUBYOPT'] = rubyopt
	
	unless ENV['COVERED_ROOT']
		ENV['COVERED_ROOT'] = @root
	end
	
	# Don't report coverage in child processes:
	ENV.delete('COVERAGE')
end

def call(output)

def call(output)
	policy.call(output)
end

def each(&block)

def each(&block)
	policy.each(&block)
end

def finish

def finish
	# Finish coverage tracking:
	policy.finish
	
	# Restore the environment:
	ENV.replace(@environment)
	@environment = nil
end

def ignore_paths

def ignore_paths
	['test/', 'fixtures/', 'spec/', 'vendor/', 'config/']
end

def initialize(root, coverage)

def initialize(root, coverage)
	@root = root
	@coverage = coverage
	@policy = nil
	
	@environment = nil
end

def make_policy(policy)

Override this method to implement your own policy.
def make_policy(policy)
	# Only files in the root would be tracked:
	policy.root(@root)
	
	patterns = ignore_paths.map do |path|
		File.join(@root, path)
	end
	
	# We will ignore any files in the test or spec directory:
	policy.skip(Regexp.union(patterns))
	
	# We will include all files under lib, even if they aren't loaded:
	policy.include("lib/**/*.rb")
	
	policy.persist!
	
	policy.reports!(@coverage)
end

def output

def output
	policy.output
end

def policy

def policy
	@policy ||= Policy.new.tap{|policy| make_policy(policy)}.freeze
end

def report?

def report?
	!!@coverage
end

def start

def start
	# Save and setup the environment:
	@environment = ENV.to_h
	autostart!
	
	# Start coverage tracking:
	policy.start
end