class Console::Filter

def self.[] **levels

def self.[] **levels
	klass = Class.new(self)
	
	klass.instance_exec do
		const_set(:LEVELS, levels)
		const_set(:MINIMUM_LEVEL, levels.values.min)
		const_set(:MAXIMUM_LEVEL, levels.values.max)
		
		levels.each do |name, level|
			const_set(name.to_s.upcase, level)
			
			define_method(name) do |subject = nil, *arguments, **options, &block|
				if self.enabled?(subject, level)
					self.call(subject, *arguments, severity: name, **options, **@options, &block)
				end
			end
			
			define_method("#{name}!") do
				@level = level
			end
			
			define_method("#{name}?") do
				@level >= level
			end
		end
	end
	
	return klass
end

def all!

def all!
	@level = -1
end

def call(*arguments, **options, &block)

def call(*arguments, **options, &block)
	@output.call(*arguments, **options, &block)
end

def disable(subject)

Parameters:
  • name (String, Class) -- The class to disable.
def disable(subject)
	unless subject.is_a? Class
		subject = subject.class
	end
	
	@subjects.delete(subject)
end

def enable(subject, level = self.class::MINIMUM_LEVEL)

Parameters:
  • name (String, Class) -- The class to enable.
def enable(subject, level = self.class::MINIMUM_LEVEL)
	unless subject.is_a?(Class)
		subject = subject.class
	end
	
	@subjects[subject] = level
end

def enabled?(subject, level = self.class::MINIMUM_LEVEL)

Parameters:
  • subject (Object) -- the subject to check.
def enabled?(subject, level = self.class::MINIMUM_LEVEL)
	if specific_level = @subjects[subject.class]
		return level >= specific_level
	end
	
	if level >= @level
		return true
	end
end

def initialize(output, verbose: true, level: self.class::DEFAULT_LEVEL, enabled: nil, **options)

def initialize(output, verbose: true, level: self.class::DEFAULT_LEVEL, enabled: nil, **options)
	@output = output
	@verbose = verbose
	@level = level
	
	@subjects = {}
	
	@options = options
	
	if enabled
		enabled.each{|name| enable(name)}
	end
end

def level= level

def level= level
	if level.is_a? Symbol
		@level = self.class::LEVELS[level]
	else
		@level = level
	end
end

def off!

def off!
	@level = self.class::MAXIMUM_LEVEL + 1
end

def verbose!(value = true)

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

def with(level: @level, verbose: @verbose, **options)

def with(level: @level, verbose: @verbose, **options)
	dup.tap do |logger|
		logger.level = level
		logger.verbose! if verbose
		logger.options = @options.merge(options)
	end
end