lib/yell/repository.rb
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