# 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

MUTATOR_METHODS

  Methods that mutate a VividMash. Each of them is overridden so that it also invalidates the cached merged_attributes on the root Attribute object.

### Attributes

root[R]

### Public Class Methods

new(root, data={}) click to toggle source
Calls superclass method Mash.new

    # File lib/chef/node/attribute_collections.rb, line 137
    def initialize(root, data={})
      @root = root
      super(data)
    end

### Public Instance Methods

[](key) click to toggle source
Calls superclass method

    # 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

[]=(key, value) click to toggle source
Calls superclass method Mash#[]=

    # 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

convert_key(key) click to toggle source
Calls superclass method Mash#convert_key

    # File lib/chef/node/attribute_collections.rb, line 185
    def convert_key(key)
      super
    end

convert_value(value) click to toggle source

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

dup() click to toggle source

    # File lib/chef/node/attribute_collections.rb, line 206
    def dup
      Mash.new(self)
    end

method_missing(symbol, *args) click to toggle source
Calls superclass method

    # 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

set_unless?() click to toggle source

    # File lib/chef/node/attribute_collections.rb, line 181
    def set_unless?
      @root.set_unless?
    end