forwardable-extended 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: