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 +4 -4
- data/lib/forwardable/extended.rb +64 -41
- data/lib/forwardable/extended/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44928a73258dd5fea629b2a83f2c33606ca922c1
|
4
|
+
data.tar.gz: 6848d6b288a73cbbbdabfcc3941e2a5bc1ab4f71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0761c6e6e3ce5346eac28ab13f56c8fb64a7f185b9beb8051611feaeb417f0ea63cc48d4a2ee01b36af38e83378553eca0fb65a4bc85ca7c29275cf0716a743e
|
7
|
+
data.tar.gz: 62c8057174d3a5fe87163a6cc99a3408a2ccebfdccd69acb0f0a89a276393745dbe3e2eba9b5f6c9e4a715451adf5dff500cefa9118a31e980b1dca93e997486
|
data/lib/forwardable/extended.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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,
|
27
|
-
prefix = (
|
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
|
-
|
45
|
-
|
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
|
-
|
65
|
-
|
90
|
+
private
|
91
|
+
def __prepare(wrap: nil, bool: false)
|
66
92
|
prefix = (bool == :reverse ? "!!!" : "!!") if bool
|
67
|
-
wrap
|
68
|
-
|
69
|
-
suffix = (bool ? "?" : "")
|
93
|
+
wrap = "self.class.new" if wrap.is_a?(TrueClass)
|
94
|
+
suffix = "?" if bool
|
70
95
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
-
STR
|
96
|
+
return [
|
97
|
+
prefix, suffix, wrap
|
98
|
+
]
|
76
99
|
end
|
77
100
|
end
|
78
101
|
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.
|
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-
|
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:
|