    # File lib/chef/node/attribute.rb, line 89
          def [](key)
            @current_nesting_level << key

            # We set this to so that we can cope with ||= as a setting.
            # See the comments in []= for more details.
            @has_been_read = true

            # If we have a set type, our destiny is to write
            if @set_type
              a_value = @set_type == :automatic ? value_or_descend(current_automatic, key, auto_vivifiy_on_read) : nil
              o_value = @set_type == :override ? value_or_descend(current_override, key, auto_vivifiy_on_read) : nil
              n_value = @set_type == :normal ? value_or_descend(current_normal, key, auto_vivifiy_on_read) : nil
              d_value = @set_type == :default ? value_or_descend(current_default, key, auto_vivifiy_on_read) : nil

              determine_value(a_value, o_value, n_value, d_value)
            # Our destiny is only to read, so we get the full list.
            else
              a_value = value_or_descend(current_automatic, key)
              o_value = value_or_descend(current_override, key)
              n_value = value_or_descend(current_normal, key)
              d_value = value_or_descend(current_default, key)

              determine_value(a_value, o_value, n_value, d_value)
            end
          end