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