Module: Forwardable::Extended
- Defined in:
- lib/forwardable/extended.rb,
lib/forwardable/extended/version.rb
Constant Summary collapse
- VERSION =
"2.6.0"
Class Method Summary collapse
-
.extended(klass) ⇒ Object
———————————————————————— Make our methods private on the class, there is no reason for public.
Instance Method Summary collapse
-
#def_delegator(accessor, method, alias_ = method, **kwd) ⇒ Object
———————————————————————— Wraps around traditional delegation and modern delegation.
-
#def_delegators(accessor, *methods) ⇒ Object
———————————————————————— Create multiple delegates at once.
-
#def_hash_delegator(hash, method, key: method, **kwd) ⇒ Object
———————————————————————— Delegate a method to a hash and key.
-
#def_ivar_delegator(ivar, alias_ = ivar, **kwd) ⇒ Object
———————————————————————— Delegate a method to an instance variable.
-
#def_modern_delegator(accessor, method, alias_ = method, args: { :before => [], :after => [] }, **kwd) ⇒ Object
———————————————————————— Like def_delegator but allows you to send args and do other stuff.
-
#rb_delegate(method, to: nil, alias_of: method, **kwd) ⇒ Object
———————————————————————— Delegate using a Rails-like interface.
Class Method Details
.extended(klass) ⇒ Object
Make our methods private on the class, there is no reason for public.
17 18 19 20 21 22 23 |
# File 'lib/forwardable/extended.rb', line 17 def self.extended(klass) instance_methods.each do |method| klass.private_class_method( method ) end end |
Instance Method Details
#def_delegator(accessor, method, alias_ = method, **kwd) ⇒ Object
Wraps around traditional delegation and modern delegation.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/forwardable/extended.rb', line 135 def def_delegator(accessor, method, alias_ = method, **kwd) kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any? if alias_.is_a?(Hash) || !kwd.any? Forwardable.instance_method(:def_delegator).bind(self) \ .call(accessor, method, alias_) elsif !kwd[:type] def_modern_delegator( accessor, method, alias_, **kwd ) else raise ArgumentError, "Alias not supported." if alias_ != method send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap do |obj| obj.delete(:type) end) end end |
#def_delegators(accessor, *methods) ⇒ Object
Create multiple delegates at once.
159 160 161 162 163 164 165 166 167 |
# File 'lib/forwardable/extended.rb', line 159 def def_delegators(accessor, *methods) kwd = methods.shift if methods.first.is_a?(Hash) kwd = methods.pop if methods. last.is_a?(Hash) kwd = {} unless kwd methods.each do |method| def_delegator accessor, method, **kwd end end |
#def_hash_delegator(hash, method, key: method, **kwd) ⇒ Object
Delegate a method to a hash and key.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/forwardable/extended.rb', line 40 def def_hash_delegator(hash, method, key: method, **kwd) prefix, suffix, wrap = prepare_delegate(**kwd) if suffix method = method.to_s.gsub( /\?$/, "" ) end class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 def #{method}#{suffix}(*args) #{wrap}( #{prefix}#{hash}[#{key.inspect}] ) rescue Exception if !Forwardable.debug && $@ && [email protected]_to?(:delete_if) [email protected]_if do |source| source =~ %r"#{Regexp.escape(__FILE__)}"o end end raise end STR end |
#def_ivar_delegator(ivar, alias_ = ivar, **kwd) ⇒ Object
Delegate a method to an instance variable.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/forwardable/extended.rb', line 71 def def_ivar_delegator(ivar, alias_ = ivar, **kwd) prefix, suffix, wrap = prepare_delegate(**kwd) if suffix alias_ = alias_.to_s.gsub( /\?$/, "" ) end class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 def #{alias_.to_s.gsub(/\A@/, "")}#{suffix} #{wrap}( #{prefix}#{ivar} ) rescue Exception if !Forwardable.debug && $@ && [email protected]_to?(:delete_if) [email protected]_if do |source| source =~ %r"#{Regexp.escape(__FILE__)}"o end end raise end STR end |
#def_modern_delegator(accessor, method, alias_ = method, args: { :before => [], :after => [] }, **kwd) ⇒ Object
Like def_delegator but allows you to send args and do other stuff.
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/forwardable/extended.rb', line 102 def def_modern_delegator(accessor, method, alias_ = method, args: \ { :before => [], :after => [] }, **kwd) prefix, suffix, wrap = prepare_delegate(**kwd) args = { :before => args } unless args.is_a?(Hash) b = [args[:before]].flatten.compact.map(&:to_s).join(", ") a = [args[ :after]].flatten.compact.map(&:to_s).join(", ") b = b + ", " unless args[:before].nil? || args[:before].empty? a = ", " + a unless args[ :after].nil? || args[ :after].empty? alias_ = alias_.to_s.gsub(/\?$/, "") if suffix class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 10 def #{alias_}#{suffix}(*args, &block) #{wrap}(#{prefix}#{accessor}.send( #{method.inspect}, #{b}*args#{a}, &block )) rescue Exception if !Forwardable.debug && $@ && [email protected]_to?(:delete_if) [email protected]_if do |source| source =~ %r"#{Regexp.escape(__FILE__)}"o end end raise end STR end |
#rb_delegate(method, to: nil, alias_of: method, **kwd) ⇒ Object
Delegate using a Rails-like interface.
29 30 31 32 33 34 |
# File 'lib/forwardable/extended.rb', line 29 def rb_delegate(method, to: nil, alias_of: method, **kwd) raise ArgumentError, "to must be provided" unless to def_delegator( to, alias_of, method, **kwd ) end |