class Nocode::Util::ClassRegistry

Create a type -> class constant interface. Classes can be registered as types. Types are snake-cased while class names are stored as pascal-cased. Then constant! can be called to retrieve the class constant by type.

Attributes

types_to_classes[R]

Public Class Methods

new(types_to_classes = {}) click to toggle source
# File lib/nocode/util/class_registry.rb, line 17
def initialize(types_to_classes = {})
  @types_to_classes = Dictionary.new(types_to_classes)

  freeze
end

Public Instance Methods

constant!(type) click to toggle source
# File lib/nocode/util/class_registry.rb, line 43
def constant!(type)
  name = types_to_classes[type]

  raise NotRegisteredError, "Constant not registered for: #{type}" if name.to_s.empty?

  if Object.const_defined?(name, false)
    Object.const_get(name, false)
  else
    Object.const_missing(name)
  end
end
load(types, class_prefix: '', type_prefix: '') click to toggle source
# File lib/nocode/util/class_registry.rb, line 23
def load(types, class_prefix: '', type_prefix: '')
  types.each do |type|
    pascal_cased = type.split(File::SEPARATOR).map do |part|
      part.split('_').collect(&:capitalize).join
    end.join('::')

    register("#{type_prefix}#{type}", "#{class_prefix}#{pascal_cased}")
  end

  self
end
register(type, class_name) click to toggle source
# File lib/nocode/util/class_registry.rb, line 35
def register(type, class_name)
  tap { types_to_classes[type] = class_name }
end
unregister(type) click to toggle source
# File lib/nocode/util/class_registry.rb, line 39
def unregister(type)
  tap { types_to_classes.delete(type) }
end