class Dry::Core::ClassBuilder
Class for generating more classes
def call
-
(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
- 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)
- Api: - private
def create_base(namespace, name, parent) 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
- 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) const_get(name).name if RUBY_VERSION < '2.4' 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