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