forwardable-extended 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2aee4eb76e135c0b524a2e7789499fd26ab9b587
4
- data.tar.gz: 0dac1c644c9fdf0a6f7b72fd93dd012d452753a3
3
+ metadata.gz: 44928a73258dd5fea629b2a83f2c33606ca922c1
4
+ data.tar.gz: 6848d6b288a73cbbbdabfcc3941e2a5bc1ab4f71
5
5
  SHA512:
6
- metadata.gz: 8422bfbcd02da7e99a25499f0fafa7a9fbb5bf215e1475343ac4e154fadbf02cd28aa32a41436e26f683cb68103f7525aba4d017ebd0e47546ed582b57b40d6e
7
- data.tar.gz: 6b04cd0250f1aad93b99fffe86ab455f01172ac0072222c36e0a20f07be0853690a51b33d26d4036cb1ea5a8fe98fb13da4f7288e6f165df401c91f894f4306a
6
+ metadata.gz: 0761c6e6e3ce5346eac28ab13f56c8fb64a7f185b9beb8051611feaeb417f0ea63cc48d4a2ee01b36af38e83378553eca0fb65a4bc85ca7c29275cf0716a743e
7
+ data.tar.gz: 62c8057174d3a5fe87163a6cc99a3408a2ccebfdccd69acb0f0a89a276393745dbe3e2eba9b5f6c9e4a715451adf5dff500cefa9118a31e980b1dca93e997486
@@ -8,71 +8,94 @@ require "forwardable"
8
8
  module Forwardable
9
9
  module Extended
10
10
  DEF_DELEGATOR = Object::Forwardable.instance_method(:def_delegator)
11
- def def_hash_delegator(hash, method, key: method, bool: false, wrap: false)
12
- prefix = (bool == :reverse ? "!!!" : "!!") if bool
13
- wrap = "self.class.new" if wrap.is_a?(TrueClass)
14
- wrap = wrap ? "#{wrap} " : ""
15
- suffix = (bool ? "?" : "")
11
+
12
+ # Delegates a method to a `hash[key]`.
13
+ # @param [Symbol] key used if method is an alias; disignates the hash key.
14
+ # @param [Hash] hash the hash object you wish to delegate to.
15
+
16
+ def def_hash_delegator(hash, method, key: method, **kwd)
17
+ prefix, suffix, wrap = __prepare(**kwd)
16
18
 
17
19
  class_eval <<-STR, __FILE__, __LINE__
18
- def #{method}#{suffix}
19
- #{wrap}#{prefix}#{hash}[#{key.inspect}]
20
+ def #{method}#{suffix}(*args)
21
+ #{wrap} #{prefix} #{hash}[#{key.inspect}]
20
22
  end
21
23
  STR
22
24
  end
23
25
 
24
- #
26
+ # Delegates a method to an instance variable.
27
+ # @note if you are not using an alias or booleans use `attr_reader`.
28
+ # @param [String, Symbol] ivar the instance variable.
29
+ # @param [String, Symbol] alias_ the alias.
25
30
 
26
- def def_ivar_delegator(ivar, alias_ = ivar, bool: false, wrap: false)
27
- prefix = (bool == :reverse ? "!!!" : "!!") if bool
28
- wrap = "self.class.new" if wrap.is_a?(TrueClass)
29
- wrap = wrap ? "#{wrap} " : ""
30
- suffix = (bool ? "?" : "")
31
+ def def_ivar_delegator(ivar, alias_ = ivar, **kwd)
32
+ prefix, suffix, wrap = __prepare(**kwd)
31
33
 
32
34
  class_eval <<-STR, __FILE__, __LINE__
33
35
  def #{alias_.to_s.gsub(/\A@/, "")}#{suffix}
34
- #{wrap}#{prefix}#{ivar}
36
+ #{wrap} #{prefix} #{ivar}
37
+ end
38
+ STR
39
+ end
40
+
41
+ # A more beefed up version of Ruby's `def_delegator` that
42
+ # offers a tiny bit more than the default version in `Forwardable`
43
+ # @param [Object<>] accessor the object to ship your method to.
44
+ # @param [String, Symbol] method the method being messaged.
45
+ # @param [Array<>] args the arguments to place in front.
46
+
47
+ def def_modern_delegator(accessor, method, alias_ = method, args: [], **kwd)
48
+ args = [args].flatten.compact.map(&:to_s).unshift("").join(", ")
49
+ prefix, suffix, wrap = __prepare(**kwd)
50
+
51
+ class_eval <<-STR, __FILE__, __LINE__
52
+ def #{alias_}#{suffix}(*args, &block)
53
+ #{wrap} #{prefix} #{accessor}.send(#{method.inspect}#{args}, *args, &block)
35
54
  end
36
55
  STR
37
56
  end
38
57
 
39
- #
58
+ # Wraps around traditional def_delegator to offer forwarding to modern,
59
+ # ivar and hash delegators. With a bit of data checking between.
60
+ # @see `Object::Forwardable#def_delegator`
40
61
 
41
62
  def def_delegator(accessor, method, alias_ = method, **kwd)
42
63
  kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any?
64
+ return DEF_DELEGATOR.bind(self).call(accessor, method, alias_) if alias_.is_a?(Hash) || !kwd.any?
65
+ return def_modern_delegator(accessor, method, alias_, **kwd) unless kwd[:type]
66
+
67
+ raise ArgumentError, "Alias not supported with type" if alias_ != method
68
+ send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap { |obj|
69
+ obj.delete(:type)
70
+ })
71
+ end
72
+
73
+ # Wraps around traditional `def_delegators` to detect hash arguments.
74
+ # @see `Object::Forwardable#def_delegators`
75
+
76
+ def def_delegators(accessor, *methods)
77
+ kwd = methods.shift if methods.first.is_a?(Hash)
78
+ kwd = methods.pop if methods. last.is_a?(Hash)
79
+ kwd = {} unless kwd
43
80
 
44
- if alias_.is_a?(Hash) || !kwd.any?
45
- DEF_DELEGATOR.bind(self).call(
46
- accessor, method, alias_
47
- )
48
-
49
- elsif kwd[:type]
50
- raise ArgumentError, "Alias not supported with type; the method is the alias" if alias_ != method
51
- send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap { |obj|
52
- obj.delete(:type)
53
- })
54
-
55
- else
56
- def_modern_delegator(
57
- accessor, method, alias_, **kwd
58
- )
81
+ methods.each do |method|
82
+ def_delegator accessor, method, **kwd
59
83
  end
60
84
  end
61
85
 
62
- #
86
+ # Prepares the suffix, prefix and wrap method if available.
87
+ # @param [true, false, :reverse] bool whether or not this is a boolean.
88
+ # @param [true, Symbol, String] wrap wrap result into the wrap.
63
89
 
64
- def def_modern_delegator(accessor, method, alias_ = method, args: [], bool: false, wrap: false)
65
- args = [args].flatten.compact.map(&:to_s).unshift("").join(", ")
90
+ private
91
+ def __prepare(wrap: nil, bool: false)
66
92
  prefix = (bool == :reverse ? "!!!" : "!!") if bool
67
- wrap = "self.class.new" if wrap.is_a?(TrueClass)
68
- wrap = wrap ? "#{wrap} " : ""
69
- suffix = (bool ? "?" : "")
93
+ wrap = "self.class.new" if wrap.is_a?(TrueClass)
94
+ suffix = "?" if bool
70
95
 
71
- class_eval <<-STR, __FILE__, __LINE__
72
- def #{alias_}#{suffix}(*args, &block)
73
- #{wrap}#{prefix}#{accessor}.send(#{method.inspect}#{args + ", *args"}, &block)
74
- end
75
- STR
96
+ return [
97
+ prefix, suffix, wrap
98
+ ]
76
99
  end
77
100
  end
78
101
  end
@@ -4,6 +4,6 @@
4
4
 
5
5
  module Forwardable
6
6
  module Extended
7
- VERSION = "2.2.0"
7
+ VERSION = "2.3.0"
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forwardable-extended
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordon Bedwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-14 00:00:00.000000000 Z
11
+ date: 2016-01-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Forwardable with hash, and instance variable extensions.
14
14
  email: