class Samovar::Command

def self.[](*input, **options)

def self.[](*input, **options)
	self.new(input, **options)
end

def self.append(row)

def self.append(row)
	attr_accessor(row.key) if row.respond_to?(:key)
	
	self.table << row
end

def self.command_line(name)

def self.command_line(name)
	if table = self.table.merged
		"#{name} #{table.merged.usage}"
	else
		name
	end
end

def self.many(*args, **options)

def self.many(*args, **options)
	append Many.new(*args, **options)
end

def self.nested(*args, **options)

def self.nested(*args, **options)
	append Nested.new(*args, **options)
end

def self.one(*args, **options)

def self.one(*args, **options)
	append One.new(*args, **options)
end

def self.options(*args, **options, &block)

def self.options(*args, **options, &block)
	append Options.parse(*args, **options, &block)
end

def self.parse(input = ARGV)

The top level entry point for parsing ARGV.
def self.parse(input = ARGV)
	self.new(input)
rescue Error => error
	error.command.print_usage(output: $stderr) do |formatter|
		formatter.map(error)
	end
	
	return nil
end

def self.split(*args, **options)

def self.split(*args, **options)
	append Split.new(*args, **options)
end

def self.table

def self.table
	@table ||= Table.nested(self)
end

def self.usage(rows, name)

def self.usage(rows, name)
	rows.nested(name, self) do |rows|
		return unless table = self.table.merged
		
		table.each do |row|
			if row.respond_to?(:usage)
				row.usage(rows)
			else
				rows << row
			end
		end
	end
end

def [](*input)

def [](*input)
	self.dup.tap{|command| command.parse(input)}
end

def initialize(input = nil, name: File.basename($0), parent: nil)

def initialize(input = nil, name: File.basename($0), parent: nil)
	@name = name
	@parent = parent
	
	parse(input) if input
end

def parse(input)

def parse(input)
	self.class.table.merged.parse(input, self)
	
	if input.empty?
		return self
	else
		raise InvalidInputError.new(self, input)
	end
end

def print_usage(output: $stderr, formatter: Output::UsageFormatter, &block)

def print_usage(output: $stderr, formatter: Output::UsageFormatter, &block)
	rows = Output::Rows.new
	
	self.class.usage(rows, @name)
	
	formatter.print(rows, output, &block)
end