module Rosetta::Support::Registerable

Attributes

registered[R]

Public Class Methods

[](key) click to toggle source
# File lib/rosetta/support/registerable.rb, line 15
def [](key)
  registered[key]
end

Public Instance Methods

registerable_as(nature) click to toggle source
# File lib/rosetta/support/registerable.rb, line 9
      def registerable_as(nature)
        @registered = {}

        class << self
          attr_reader :registered

          def [](key)
            registered[key]
          end
        end

        define_singleton_method :register do |name, object=nil, &block|
          nature = nature.to_s
          error_name = :"Existing#{nature.camelize}Error"
          error_class = if constants.include?(error_name)
                          const_get(error_name)
                        else
                          RegistrationError
                        end
          raise error_class, <<-ERROR.strip if @registered.key? name
            #{nature.titleize} #{name} is already registered.
          ERROR

         if object && block
           raise ArgumentError, "Can't take both #{nature.downcase} object and block."
         end
          @registered[name] = object || block
        end
      end