class Dry::Core::ClassBuilder

Class for generating more classes

def call

Returns:
  • (Class) -

Other tags:
    Example: Create named class -
    Example: Create anonymous class -
def call
  klass = if namespace
            create_named
          else
            create_anonymous
          end
  yield(klass) if block_given?
  klass
end

def create_anonymous

Other tags:
    Api: - private
def create_anonymous
  klass = ::Class.new(parent)
  name = self.name
  klass.singleton_class.class_eval do
    define_method(:name) { name }
    alias_method :inspect, :name
    alias_method :to_s, :name
  end
  klass
end

def create_base(namespace, name, parent)

Other tags:
    Api: - private
def create_base(namespace, name, parent)
  begin
    namespace.const_get(name)
  rescue NameError # rubocop:disable Lint/SuppressedException
  end
  if namespace.const_defined?(name, false)
    existing = namespace.const_get(name)
    unless existing <= parent
      raise ParentClassMismatch, "#{existing.name} must be a subclass of #{parent.name}"
    end
    existing
  else
    klass = ::Class.new(parent || ::Object)
    namespace.const_set(name, klass)
    klass
  end
end

def create_named

Other tags:
    Api: - private
def create_named
  name = self.name
  base = create_base(namespace, name, parent)
  klass = ::Class.new(base)
  namespace.module_eval do
    remove_const(name)
    const_set(name, klass)
    remove_const(name)
    const_set(name, base)
  end
  klass
end

def initialize(name:, parent: nil, namespace: nil)

def initialize(name:, parent: nil, namespace: nil)
  @name = name
  @namespace = namespace
  @parent = parent || ::Object
end