Class RR::Injections::SingletonMethodAddedInjection
In: lib/rr/injections/singleton_method_added_injection.rb
Parent: Injection

Methods

Included Modules

ClassInstanceMethodDefined

Attributes

subject_class  [R] 

Public Class methods

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 22
22:       def initialize(subject_class)
23:         @subject_class = subject_class
24:         @placeholder_method_defined = false
25:       end

Public Instance methods

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 27
27:       def bind
28:         unless class_instance_method_defined(subject_class, original_method_alias_name, false)
29:           unless class_instance_method_defined(subject_class, :singleton_method_added, false)
30:             @placeholder_method_defined = true
31:             subject_class.class_eval do
32:               def singleton_method_added(method_name)
33:                 super
34:               end
35:             end
36:           end
37: 
38:           memoized_original_method_alias_name = original_method_alias_name
39:           subject_class.__send__(:alias_method, original_method_alias_name, :singleton_method_added)
40:           memoized_subject_class = subject_class
41:           memoized_original_method_alias_name = original_method_alias_name
42:           subject_class.__send__(:define_method, :singleton_method_added) do |method_name_arg|
43:             if Injections::DoubleInjection.exists?(memoized_subject_class, method_name_arg)
44:               Injections::DoubleInjection.find_or_create(memoized_subject_class, method_name_arg).send(:deferred_bind_method)
45:             end
46:             __send__(memoized_original_method_alias_name, method_name_arg)
47:           end
48:         end
49:         self
50:       end

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 15
15:         def exists?(subject)
16:           instances.include?(subject)
17:         end

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 11
11:         def find(subject)
12:           instances[subject]
13:         end

[Source]

   # 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

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 52
52:       def reset
53:         if subject_has_method_defined?(original_method_alias_name)
54:           memoized_original_method_alias_name = original_method_alias_name
55:           placeholder_method_defined = @placeholder_method_defined
56:           subject_class.class_eval do
57:             remove_method :singleton_method_added
58:             unless placeholder_method_defined
59:               alias_method :singleton_method_added, memoized_original_method_alias_name
60:             end
61:             remove_method memoized_original_method_alias_name
62:           end
63:         end
64:       end

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 32
32:               def singleton_method_added(method_name)
33:                 super
34:               end

Protected Instance methods

[Source]

    # File lib/rr/injections/singleton_method_added_injection.rb, line 67
67:       def original_method_alias_name
68:         "__rr__original_singleton_method_added"
69:       end

[Validate]