class Chef::Node::VividMash
VividMash¶ ↑
VividMash is identical to a Mash, with a few exceptions:
-
It has a reference to the root Chef::Node::Attribute to which it belongs, and will trigger cache invalidation on that object when mutated.
-
It auto-vivifies, that is a reference to a missing element will result in the creation of a new VividMash for that key. (This only works when using the element reference method, `[]` – other methods, such as fetch, work as normal).
-
It supports a set_unless flag (via the root Attribute object) which allows `||=` style behavior (`||=` does not work with auto-vivification). This is only implemented for []=; methods such as store work as normal.
-
attr_accessor style element set and get are supported via #method_missing
Constants
Attributes
Public Class Methods
# File lib/chef/node/attribute_collections.rb, line 137 def initialize(root, data={}) @root = root super(data) end
Public Instance Methods
# File lib/chef/node/attribute_collections.rb, line 142 def [](key) value = super if !key?(key) value = self.class.new(root) self[key] = value else value end end
# File lib/chef/node/attribute_collections.rb, line 152 def []=(key, value) if set_unless? && key?(key) self[key] else root.reset_cache super end end
# File lib/chef/node/attribute_collections.rb, line 185 def convert_key(key) super end
Mash uses convert_value to mashify values on input. We override it here to convert hash or array values to VividMash or AttrArray for consistency and to ensure that the added parts of the attribute tree will have the correct cache invalidation behavior.
# File lib/chef/node/attribute_collections.rb, line 193 def convert_value(value) case value when VividMash value when Hash VividMash.new(root, value) when Array AttrArray.new(root, value) else value end end
# File lib/chef/node/attribute_collections.rb, line 206 def dup Mash.new(self) end
# File lib/chef/node/attribute_collections.rb, line 163 def method_missing(symbol, *args) # Calling `puts arg` implicitly calls #to_ary on `arg`. If `arg` does # not implement #to_ary, ruby recognizes it as a single argument, and # if it returns an Array, then ruby prints each element. If we don't # account for that here, we'll auto-vivify a VividMash for the key # :to_ary which creates an unwanted key and raises a TypeError. if symbol == :to_ary super elsif args.empty? self[symbol] elsif symbol.to_s =~ /=$/ key_to_set = symbol.to_s[/^(.+)=$/, 1] self[key_to_set] = (args.length == 1 ? args[0] : args) else raise NoMethodError, "Undefined node attribute or method `#{symbol}' on `node'. To set an attribute, use `#{symbol}=value' instead." end end
# File lib/chef/node/attribute_collections.rb, line 181 def set_unless? @root.set_unless? end