class Delfos::Patching::ModuleDefiner
Attributes
class_method[R]
klass[R]
method_name[R]
Public Class Methods
new(klass, method_name, class_method)
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 26 def initialize(klass, method_name, class_method) @klass, @method_name, @class_method = klass, method_name, class_method end
Public Instance Methods
perform(&block)
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 30 def perform(&block) safe_method_name = safe_method_name() safe_class_name = safe_class_name() module_type = class_method ? "ClassMethodLogging" : "InstanceMethodLogging" find_or_create = method(:find_or_create) m = nil Patching.const_get(module_type).instance_eval do namespace = find_or_create.call(self, safe_class_name) m = find_or_create.call(namespace, safe_method_name) m.class_eval(&block) if block_given? m end end
Private Instance Methods
create(container, module_name)
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 74 def create(container, module_name) m = Module.new container.const_set(module_name, m) return m rescue Exception => e m end
find_or_create(container, module_name)
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 58 def find_or_create(container, module_name) module_name = module_name.tr(":", "_") result = container.const_get(module_name) # E.g. finding `::A' instead of Delfos::Patching::InstanceMethodLogging::A if result == klass || result.name[module_name] == result.name create(container, module_name) else result end rescue NameError => e raise unless e.message[module_name] create(container, module_name) end
module_safe_name(string, _uppercase_first_letter = true)
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 83 def module_safe_name(string, _uppercase_first_letter = true) string = string.sub(/^[a-z\d]*/) { $&.capitalize } string. gsub(/(?:_|(\/))([a-z\d]*)/) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }. gsub("/", "::"). gsub(/\=/, "Equals"). gsub(/\<\=\>/, "Spaceship"). gsub(/\<\=/, "LessThanOrEqualTo"). gsub(/\>\=/, "GreaterThanOrEqualTo"). gsub(/\#\<Class\:0x(.*)\>/) { "AnonymousClass_#{Regexp.last_match(1)}" }. gsub(/\>/, "GreaterThan"). gsub(/\</, "LessThan"). gsub(/!\~/, "NotMatchOperator"). gsub(/\~/, "MatchOperator"). gsub(/\?/, "QuestionMark"). gsub(/\!$/, "Bang"). gsub(/\+/, "Plus"). gsub(/\[\]/, "SquareBrackets") end
safe_class_name()
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 50 def safe_class_name module_safe_name(klass.name || klass.to_s) end
safe_method_name()
click to toggle source
# File lib/delfos/patching/module_defining_methods.rb, line 54 def safe_method_name module_safe_name(method_name.to_s) end