class Console::Terminal::Logger

def build_prefix(name)

def build_prefix(name)
	if @verbose
		"#{time_offset_prefix} #{name.rjust(8)}"
	else
		time_offset_prefix
	end
end

def call(subject = nil, *arguments, name: nil, severity: UNKNOWN, &block)

def call(subject = nil, *arguments, name: nil, severity: UNKNOWN, &block)
	prefix = build_prefix(name || severity.to_s)
	indent = " " * prefix.size
	
	buffer = Buffer.new("#{indent}| ")
	
	if subject
		format_subject(severity, prefix, subject, buffer)
	end
	
	arguments.each do |argument|
		format_argument(argument, buffer)
	end
	
	if block_given?
		if block.arity.zero?
			format_argument(yield, buffer)
		else
			yield(buffer, @terminal)
		end
	end
	
	@io.write buffer.string
end

def format_argument(argument, output)

def format_argument(argument, output)
	case argument
	when Exception
		Event::Failure.new(argument).format(output, @terminal, @verbose)
	when Event::Generic
		argument.format(output, @terminal, @verbose)
	else
		format_value(argument, output)
	end
end

def format_subject(severity, prefix, subject, output)

def format_subject(severity, prefix, subject, output)
	prefix_style = @terminal[severity]
	
	if @verbose
		suffix = " #{@terminal[:logger_suffix]}[pid=#{Process.pid}]#{@terminal.reset}"
	end
	
	output.puts "#{@terminal[:logger_prefix]}#{subject}#{@terminal.reset}#{suffix}", prefix: "#{prefix_style}#{prefix}:#{@terminal.reset} "
end

def format_value(value, output)

def format_value(value, output)
	string = value.to_s
	
	string.each_line do |line|
		output.puts "#{line}"
	end
end

def initialize(io = $stderr, verbose: nil, **options)

def initialize(io = $stderr, verbose: nil, **options)
	@io = io
	@start = Time.now
	
	@terminal = Terminal.for(io)
	
	if verbose.nil?
		@verbose = !@terminal.colors?
	else
		@verbose = verbose
	end
	
	@terminal[:logger_prefix] ||= @terminal.style(nil, nil, nil)
	@terminal[:logger_suffix] ||= @terminal.style(:white, nil, :faint)
	@terminal[:debug] = @terminal.style(:cyan)
	@terminal[:info] = @terminal.style(:green)
	@terminal[:warn] = @terminal.style(:yellow)
	@terminal[:error] = @terminal.style(:red)
	@terminal[:fatal] = @terminal[:error]
	
	self.register_defaults(@terminal)
end

def register_defaults(terminal)

def register_defaults(terminal)
	Event.constants.each do |constant|
		klass = Event.const_get(constant)
		klass.register(terminal)
	end
end

def time_offset_prefix

def time_offset_prefix
	offset = Time.now - @start
	minutes = (offset/60).floor
	seconds = (offset - (minutes*60))
	
	if minutes > 0
		"#{minutes}m#{seconds.floor}s"
	else
		"#{seconds.round(2)}s"
	end.rjust(6)
end

def verbose!(value = true)

def verbose!(value = true)
	@verbose = value
end