lib/oboe/util.rb in oboe-2.6.5.5 vs lib/oboe/util.rb in oboe-2.6.6.1

- old
+ new

@@ -2,49 +2,91 @@ # All rights reserved. module Oboe module Util class << self - ## - # method_alias - # - # Centralized utility method to alias a method on an arbitrary - # class or module. - # - def method_alias(cls, method, name=nil) + def contextual_name(cls) # Attempt to infer a contextual name if not indicated # # For example: # ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.to_s.split(/::/).last # => "AbstractMysqlAdapter" # begin - name ||= cls.to_s.split(/::/).last + cls.to_s.split(/::/).last rescue end + end + ## + # method_alias + # + # Centralized utility method to alias a method on an arbitrary + # class or module. + # + def method_alias(cls, method, name=nil) + name ||= contextual_name(cls) + if cls.method_defined? method.to_sym or cls.private_method_defined? method.to_sym - + # Strip '!' or '?' from method if present safe_method_name = method.to_s.chop if method.to_s =~ /\?$|\!$/ safe_method_name ||= method without_oboe = "#{safe_method_name}_without_oboe" with_oboe = "#{safe_method_name}_with_oboe" - + # Only alias if we haven't done so already - unless cls.method_defined? without_oboe.to_sym or + unless cls.method_defined? without_oboe.to_sym or cls.private_method_defined? without_oboe.to_sym cls.class_eval do alias_method without_oboe, "#{method}" alias_method "#{method}", with_oboe end end else Oboe.logger.warn "[oboe/loading] Couldn't properly instrument #{name}. Partial traces may occur." end end - + + ## + # class_method_alias + # + # Centralized utility method to alias a class method on an arbitrary + # class or module + # + def class_method_alias(cls, method, name=nil) + name ||= contextual_name(cls) + + if cls.singleton_methods.include? method.to_sym + + # Strip '!' or '?' from method if present + safe_method_name = method.to_s.chop if method.to_s =~ /\?$|\!$/ + safe_method_name ||= method + + without_oboe = "#{safe_method_name}_without_oboe" + with_oboe = "#{safe_method_name}_with_oboe" + + # Only alias if we haven't done so already + unless cls.singleton_methods.include? without_oboe.to_sym + cls.singleton_class.send(:alias_method, without_oboe, "#{method}") + cls.singleton_class.send(:alias_method, "#{method}", with_oboe) + end + else Oboe.logger.warn "[oboe/loading] Couldn't properly instrument #{name}. Partial traces may occur." + end + end + + ## + # send_extend + # + # Centralized utility method to send an extend call for an + # arbitrary class + def send_extend(target_cls, cls) + if defined?(target_cls) + target_cls.send(:extend, cls) + end + end + ## # send_include # # Centralized utility method to send a include call for an # arbitrary class