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) || cls.private_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 ||= {}