Class: AroundTheWorld::MethodWrapper
- Inherits:
-
Object
- Object
- AroundTheWorld::MethodWrapper
- Includes:
- ProxyCreation
- Defined in:
- lib/around_the_world/method_wrapper.rb,
lib/around_the_world/method_wrapper/proxy_creation.rb
Defined Under Namespace
Modules: ProxyCreation
Instance Attribute Summary collapse
-
#block ⇒ Object
readonly
private
Returns the value of attribute block.
-
#method_name ⇒ Object
readonly
Returns the value of attribute method_name.
-
#prevent_double_wrapping_for ⇒ Object
readonly
private
Returns the value of attribute prevent_double_wrapping_for.
-
#target ⇒ Object
readonly
Returns the value of attribute target.
Class Method Summary collapse
-
.wrap(**args, &block) ⇒ Object
Passes arguments directly to #new - see #initialize for full docs.
Instance Method Summary collapse
- #define_proxy_method ⇒ Object private
- #ensure_method_defined! ⇒ Object private
-
#initialize(method_name:, target:, prevent_double_wrapping_for: nil, &block) ⇒ MethodWrapper
constructor
A new instance of MethodWrapper.
- #method_privacy ⇒ Object private
- #prevent_double_wrapping! ⇒ Object private
- #prevent_double_wrapping? ⇒ Boolean private
-
#proxy_module ⇒ AroundTheWorld::ProxyModule
private
The proxy module upon which the method wrapper will be defined.
-
#wrap ⇒ Object
Defines the wrapped method inside a proxy module and prepends the proxy module to the target module if necessary.
Methods included from ProxyCreation
#already_wrapped?, #base_ancestry_index, #existing_proxy_module_with_purpose, #existing_proxy_modules, #proxy_module_with_purpose
Constructor Details
#initialize(method_name:, target:, prevent_double_wrapping_for: nil, &block) ⇒ MethodWrapper
Returns a new instance of MethodWrapper.
28 29 30 31 32 33 34 35 |
# File 'lib/around_the_world/method_wrapper.rb', line 28 def initialize(method_name:, target:, prevent_double_wrapping_for: nil, &block) raise TypeError, "target must be a module or a class" unless target.is_a?(Module) @method_name = method_name.to_sym @target = target @prevent_double_wrapping_for = prevent_double_wrapping_for || nil @block = block end |
Instance Attribute Details
#block ⇒ Object (readonly, private)
Returns the value of attribute block.
48 49 50 |
# File 'lib/around_the_world/method_wrapper.rb', line 48 def block @block end |
#method_name ⇒ Object (readonly)
Returns the value of attribute method_name.
18 19 20 |
# File 'lib/around_the_world/method_wrapper.rb', line 18 def method_name @method_name end |
#prevent_double_wrapping_for ⇒ Object (readonly, private)
Returns the value of attribute prevent_double_wrapping_for.
48 49 50 |
# File 'lib/around_the_world/method_wrapper.rb', line 48 def prevent_double_wrapping_for @prevent_double_wrapping_for end |
#target ⇒ Object (readonly)
Returns the value of attribute target.
18 19 20 |
# File 'lib/around_the_world/method_wrapper.rb', line 18 def target @target end |
Class Method Details
.wrap(**args, &block) ⇒ Object
Passes arguments directly to #new - see #initialize for full docs
13 14 15 |
# File 'lib/around_the_world/method_wrapper.rb', line 13 def wrap(**args, &block) new(**args, &block).wrap end |
Instance Method Details
#define_proxy_method ⇒ Object (private)
66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/around_the_world/method_wrapper.rb', line 66 def define_proxy_method proxy_module.define_method(method_name, &block) proxy_module.instance_exec(method_name, method_privacy) do |method_name, method_privacy| case method_privacy when :protected protected method_name when :private private method_name end end end |
#ensure_method_defined! ⇒ Object (private)
54 55 56 57 58 |
# File 'lib/around_the_world/method_wrapper.rb', line 54 def ensure_method_defined! return if target.instance_methods(true).include?(method_name) || target.private_method_defined?(method_name) raise MethodNotDefinedError, "#{target} does not define :#{method_name}" end |
#method_privacy ⇒ Object (private)
79 80 81 82 83 84 85 |
# File 'lib/around_the_world/method_wrapper.rb', line 79 def method_privacy if target.protected_method_defined?(method_name) :protected elsif target.private_method_defined?(method_name) :private end end |
#prevent_double_wrapping! ⇒ Object (private)
60 61 62 63 64 |
# File 'lib/around_the_world/method_wrapper.rb', line 60 def prevent_double_wrapping! return unless already_wrapped?(method_name, target, prevent_double_wrapping_for) raise DoubleWrapError, "Module #{proxy_module} already defines the method :#{method_name}" end |
#prevent_double_wrapping? ⇒ Boolean (private)
50 51 52 |
# File 'lib/around_the_world/method_wrapper.rb', line 50 def prevent_double_wrapping? prevent_double_wrapping_for.present? end |
#proxy_module ⇒ AroundTheWorld::ProxyModule (private)
Returns The proxy module upon which the method wrapper will be defined.
88 89 90 |
# File 'lib/around_the_world/method_wrapper.rb', line 88 def proxy_module @proxy_module ||= proxy_module_with_purpose(method_name, target, prevent_double_wrapping_for) end |
#wrap ⇒ Object
Defines the wrapped method inside a proxy module and prepends the proxy module to the target module if necessary.
38 39 40 41 42 43 44 |
# File 'lib/around_the_world/method_wrapper.rb', line 38 def wrap ensure_method_defined! prevent_double_wrapping! if prevent_double_wrapping? define_proxy_method target.prepend proxy_module unless target.ancestors.include?(proxy_module) end |