71 lines
1.6 KiB
Ruby
71 lines
1.6 KiB
Ruby
require 'monitor'
|
|
require "singleton"
|
|
|
|
module Yell #:nodoc:
|
|
|
|
class LoggerNotFound < StandardError
|
|
def message; "Could not find a Yell::Logger instance with the name '#{super}'"; end
|
|
end
|
|
|
|
class Repository
|
|
extend MonitorMixin
|
|
include Singleton
|
|
|
|
def initialize
|
|
@loggers = {}
|
|
end
|
|
|
|
# Set loggers in the repository
|
|
#
|
|
# @example Set a logger
|
|
# Yell::Repository[ 'development' ] = Yell::Logger.new :stdout
|
|
#
|
|
# @return [Yell::Logger] The logger instance
|
|
def self.[]=( name, logger )
|
|
synchronize { instance.loggers[name] = logger }
|
|
end
|
|
|
|
# Get loggers from the repository
|
|
#
|
|
# @example Get the logger
|
|
# Yell::Repository[ 'development' ]
|
|
#
|
|
# @raise [Yell::LoggerNotFound] Raised when repository does not have that key
|
|
# @return [Yell::Logger] The logger instance
|
|
def self.[]( name )
|
|
synchronize { instance.__fetch__(name) or raise Yell::LoggerNotFound.new(name) }
|
|
end
|
|
|
|
# Get the list of all loggers in the repository
|
|
#
|
|
# @return [Hash] The map of loggers
|
|
def self.loggers
|
|
synchronize { instance.loggers }
|
|
end
|
|
|
|
# @private
|
|
def loggers
|
|
@loggers
|
|
end
|
|
|
|
# @private
|
|
#
|
|
# Fetch the logger by the given name.
|
|
#
|
|
# If the logger could not be found and has a superclass, it
|
|
# will attempt to look there. This is important for the
|
|
# Yell::Loggable module.
|
|
def __fetch__( name )
|
|
logger = loggers[name] || loggers[name.to_s]
|
|
|
|
if logger.nil? && name.respond_to?(:superclass)
|
|
return __fetch__(name.superclass)
|
|
end
|
|
|
|
logger
|
|
end
|
|
|
|
end
|
|
end
|
|
|