module T::Props::HasLazilySpecializedMethods::DecoratorMethods

def eagerly_define_lazy_methods!

def eagerly_define_lazy_methods!
  return if lazily_defined_methods.empty?
  source = lazily_defined_methods.values.map(&:call).map(&:to_s).join("\n\n")
  cls = decorated_class
  cls.class_eval(source)
  lazily_defined_methods.each_key {|name| cls.send(:private, name)}
  lazily_defined_methods.clear
end

def eagerly_define_lazy_vm_methods!

def eagerly_define_lazy_vm_methods!
  return if lazily_defined_vm_methods.empty?
  lazily_defined_vm_methods.values.map(&:call)
  cls = decorated_class
  lazily_defined_vm_methods.each_key {|name| cls.send(:private, name)}
  lazily_defined_vm_methods.clear
end

def enqueue_lazy_method_definition!(name, &blk)

def enqueue_lazy_method_definition!(name, &blk)
_defined_methods[name] = blk
decorated_class
.method_defined?(name)
by does not emit "method redefined" warnings for aliased methods
ore robust than undef_method that would create a small window in which the method doesn't exist)
send(:alias_method, name, name)
nd(:define_method, name) do |*args|
.class.decorator.send(:eval_lazily_defined_method!, name)
(name, *args)
.respond_to?(:ruby2_keywords, true)
send(:ruby2_keywords, name)
nd(:private, name)

def enqueue_lazy_vm_method_definition!(name, &blk)

def enqueue_lazy_vm_method_definition!(name, &blk)
_defined_vm_methods[name] = blk
decorated_class
nd(:define_method, name) do |*args|
.class.decorator.send(:eval_lazily_defined_vm_method!, name)
(name, *args)
.respond_to?(:ruby2_keywords, true)
send(:ruby2_keywords, name)
nd(:private, name)

def eval_lazily_defined_method!(name)

def eval_lazily_defined_method!(name)
sLazilySpecializedMethods.lazy_evaluation_enabled?
e SourceEvaluationDisabled.new
 = lazily_defined_methods.fetch(name).call
decorated_class
ass_eval(source.to_s)
nd(:private, name)

def eval_lazily_defined_vm_method!(name)

def eval_lazily_defined_vm_method!(name)
sLazilySpecializedMethods.lazy_evaluation_enabled?
e SourceEvaluationDisabled.new
_defined_vm_methods.fetch(name).call
decorated_class
nd(:private, name)

def lazily_defined_methods

def lazily_defined_methods
y_defined_methods ||= {}

def lazily_defined_vm_methods

def lazily_defined_vm_methods
y_defined_vm_methods ||= {}