| 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