| Class | RR::Injections::MethodMissingInjection |
| In: |
lib/rr/injections/method_missing_injection.rb
|
| Parent: | Injection |
| subject_class | [R] |
# File lib/rr/injections/method_missing_injection.rb, line 17
17: def initialize(subject_class)
18: @subject_class = subject_class
19: @placeholder_method_defined = false
20: end
# File lib/rr/injections/method_missing_injection.rb, line 22
22: def bind
23: unless ClassInstanceMethodDefined.call(subject_class, original_method_alias_name)
24: unless ClassInstanceMethodDefined.call(subject_class, :method_missing)
25: @placeholder_method_defined = true
26: subject_class.class_eval do
27: def method_missing(method_name, *args, &block)
28: super
29: end
30: end
31: end
32: subject_class.__send__(:alias_method, original_method_alias_name, :method_missing)
33: bind_method
34: end
35: self
36: end
# File lib/rr/injections/method_missing_injection.rb, line 11
11: def exists?(subject)
12: instances.include?(subject)
13: end
# File lib/rr/injections/method_missing_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/method_missing_injection.rb, line 27
27: def method_missing(method_name, *args, &block)
28: super
29: end
# File lib/rr/injections/method_missing_injection.rb, line 38
38: def reset
39: if subject_has_method_defined?(original_method_alias_name)
40: memoized_original_method_alias_name = original_method_alias_name
41: placeholder_method_defined = @placeholder_method_defined
42: subject_class.class_eval do
43: remove_method :method_missing
44: unless placeholder_method_defined
45: alias_method :method_missing, memoized_original_method_alias_name
46: end
47: remove_method memoized_original_method_alias_name
48: end
49: end
50: end
# File lib/rr/injections/method_missing_injection.rb, line 53
53: def bind_method
54: subject_class_object_id = subject_class.object_id
55: subject_class.class_eval(("def method_missing(method_name, *args, &block)\nMethodDispatches::MethodMissingDispatch.new(self, ObjectSpace._id2ref(\#{subject_class_object_id}), method_name, args, block).call\nend\n"), __FILE__, __LINE__ + 1)
56: end