class Falcon::Configuration::Loader

def self.load_file(configuration, path)

def self.load_file(configuration, path)
	path = File.realpath(path)
	root = File.dirname(path)
	
	loader = self.new(configuration, root)
	
	loader.instance_eval(File.read(path), path)
end

def add(name, *parents, &block)

def add(name, *parents, &block)
	raise KeyError.new("#{name} is already set", key: name) if @environments.key?(name)
	
	environments = parents.map{|name| @environments.fetch(name)}
	
	parent = Build::Environment.combine(*environments)
	
	@environments[name] = merge(name, *parents, &block)
end

def host(name, *parents, &block)

def host(name, *parents, &block)
	environment = merge(name, :host, *parents, &block)
	
	environment[:root] = @root
	environment[:authority] = name
	
	@configuration.add(environment.flatten)
end

def initialize(configuration, root = nil)

def initialize(configuration, root = nil)
	@loaded = {}
	@configuration = configuration
	@environments = {}
	@root = root
end

def load(*features)

def load(*features)
	features.each do |feature|
		next if @loaded.include?(feature)
		
		relative_path = File.join(__dir__, "configurations", "#{feature}.rb")
		
		self.instance_eval(File.read(relative_path), relative_path)
		
		@loaded[feature] = relative_path
	end
end

def merge(name, *parents, &block)

def merge(name, *parents, &block)
	environments = parents.map{|name| @environments.fetch(name)}
	
	parent = Build::Environment.combine(*environments)
	
	return Build::Environment.new(parent, name: name, &block)
end

def proxy(name, *parents, &block)

def proxy(name, *parents, &block)
	environment = merge(name, :proxy, *parents, &block)
	
	environment[:root] = @root
	environment[:authority] = name
	
	@configuration.add(environment.flatten)
end

def rack(name, *parents, &block)

def rack(name, *parents, &block)
	environment = merge(name, :rack, *parents, &block)
	
	environment[:root] = @root
	environment[:authority] = name
	
	@configuration.add(environment.flatten)
end

def supervisor

def supervisor
	name = File.join(@root, "supervisor")
	environment = merge(name, :supervisor)
	
	environment[:root] = @root
	
	@configuration.add(environment.flatten)
end