class Bake::Command::List

def call

def call
	first = true
	terminal = @parent.terminal
	context = @parent.context
	
	if scope = context.scope
		terminal.print_line(:context, context)
		
		print_scope(terminal, context.scope)
		
		terminal.print_line
	end
	
	context.loaders.each do |loader|
		terminal.print_line(:loader, loader)
		
		loader.each do |path|
			if scope = loader.scope_for(path)
				print_scope(terminal, scope)
			end
		end
		
		terminal.print_line
	end
end

def format_parameters(parameters, terminal)

def format_parameters(parameters, terminal)
	parameters.each do |type, name|
		case type
		when :key
			name = "#{name}="
		when :keyreq
			name = "#{name}="
		when :keyrest
			name = "**#{name}"
		else
			name = name.to_s
		end
		
		terminal.print(:reset, " ")
		terminal.print(type, name)
	end
end

def format_recipe(recipe, terminal)

def format_recipe(recipe, terminal)
	terminal.print(:command, recipe.command)
	
	if parameters = recipe.parameters
		format_parameters(parameters, terminal)
	end
end

def print_scope(terminal, scope)

def print_scope(terminal, scope)
	format_recipe = self.method(:format_recipe).curry
	
	scope.recipes.sort.each do |recipe|
		terminal.print_line
		terminal.print_line("\t", format_recipe[recipe])
		
		recipe.description.each do |line|
			if match = line.match(PARAMETER)
				terminal.print_line("\t\t",
					:parameter, match[:name], :reset, " [",
					:type, match[:type], :reset, "] ",
					:description, match[:details]
				)
			else
				terminal.print_line("\t\t", :description, line)
			end
		end
	end
end