Sha256: a680b64e60ec61c9ae9aa31c44fb9bb0db88f035d495f4d3a9c90814bb1add44

Contents?: true

Size: 1.17 KB

Versions: 3

Compression:

Stored size: 1.17 KB

Contents

# frozen_string_literal: true

module Nocode
  module Util
    class ClassRegistry
      extend Forwardable

      class NotRegisteredError < StandardError; end

      attr_reader :types_to_classes

      def_delegators :types_to_classes, :to_s

      def initialize(types_to_classes = {})
        @types_to_classes = Dictionary.new(types_to_classes)

        freeze
      end

      def load(types, prefix = '')
        types.each do |type|
          pascal_cased = type.split(File::SEPARATOR).map do |part|
            part.split('_').collect(&:capitalize).join
          end.join('::')

          register(type, "#{prefix}#{pascal_cased}")
        end

        self
      end

      def register(type, class_name)
        tap { types_to_classes[type] = class_name }
      end

      def unregister(type)
        tap { types_to_classes.delete(type) }
      end

      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
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
nocode-0.0.3 lib/nocode/util/class_registry.rb
nocode-0.0.2 lib/nocode/util/class_registry.rb
nocode-0.0.1 lib/nocode/util/class_registry.rb