Class | RR::Injections::SingletonMethodAddedInjection |
In: |
lib/rr/injections/singleton_method_added_injection.rb
|
Parent: | Injection |
subject_class | [R] |
# File lib/rr/injections/singleton_method_added_injection.rb, line 21 21: def initialize(subject_class) 22: @subject_class = subject_class 23: @placeholder_method_defined = false 24: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 26 26: def bind 27: unless ClassInstanceMethodDefined.call(subject_class, original_method_alias_name, false) 28: unless ClassInstanceMethodDefined.call(subject_class, :singleton_method_added, false) 29: @placeholder_method_defined = true 30: subject_class.class_eval do 31: def singleton_method_added(method_name) 32: super 33: end 34: end 35: end 36: 37: memoized_original_method_alias_name = original_method_alias_name 38: subject_class.__send__(:alias_method, original_method_alias_name, :singleton_method_added) 39: memoized_subject_class = subject_class 40: memoized_original_method_alias_name = original_method_alias_name 41: subject_class.__send__(:define_method, :singleton_method_added) do |method_name_arg| 42: if Injections::DoubleInjection.exists?(memoized_subject_class, method_name_arg) 43: Injections::DoubleInjection.find_or_create(memoized_subject_class, method_name_arg).send(:deferred_bind_method) 44: end 45: __send__(memoized_original_method_alias_name, method_name_arg) 46: end 47: end 48: self 49: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 15 15: def exists?(subject) 16: instances.include?(subject) 17: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 11 11: def find(subject) 12: instances[subject] 13: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 5 5: def find_or_create(subject_class) 6: instances[subject_class] ||= begin 7: new(subject_class).bind 8: end 9: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 51 51: def reset 52: if subject_has_method_defined?(original_method_alias_name) 53: memoized_original_method_alias_name = original_method_alias_name 54: placeholder_method_defined = @placeholder_method_defined 55: subject_class.class_eval do 56: remove_method :singleton_method_added 57: unless placeholder_method_defined 58: alias_method :singleton_method_added, memoized_original_method_alias_name 59: end 60: remove_method memoized_original_method_alias_name 61: end 62: end 63: end
# File lib/rr/injections/singleton_method_added_injection.rb, line 31 31: def singleton_method_added(method_name) 32: super 33: end