blob: 30179d4e63314622ff4c81acad97ed925ab4ca88 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
class Chef
class Decorator < SimpleDelegator
#
# This decorator unchains method call chains and turns them into method calls
# with variable args. So this:
#
# node.set_unless["foo"]["bar"] = "baz"
#
# Can become:
#
# node.set_unless("foo", "bar", "baz")
#
# While this is a decorator it is not a Decorator and does not inherit because
# it deliberately does not need or want the method_missing magic. It is not legal
# to call anything on the intermediate values and only supports method chaining with
# #[] until the chain comes to an end with #[]=, so does not behave like a hash or
# array... e.g.
#
# node.default['foo'].keys is legal
# node.set_unless['foo'].keys is not legal now or ever
#
class Unchain
attr_accessor :__path__
attr_accessor :__method__
def initialize(obj, method)
@__path__ = []
@__method__ = method
@delegate_sd_obj = obj
end
def [](key)
__path__.push(key)
self
end
def []=(key, value)
__path__.push(key)
@delegate_sd_obj.public_send(__method__, *__path__, value)
end
end
end
end
|