    # File lib/chef/node/attribute.rb, line 319
          def []=(key, value)
            # If we don't have one, then we'll pretend we're normal
            if @set_type.nil?
              @set_type = :normal
              warning="Setting attributes without specifying a precedence is deprecated and will be\nremoved in Chef 11.0. To set attributes at normal precedence, change code like:\n`node[\"key\"] = \"value\"` # Not this\nto:\n`node.set[\"key\"] = \"value\"` # This\n\nCalled from:\n"

              warning_with_line_nrs = caller[0...3].inject(warning) do |msg, source_line|
                msg << "  #{source_line}\n"
              end

              Chef::Log.warn(warning_with_line_nrs) if Chef::Config[:chef11_deprecation_warnings]
            end

            if set_unless_value_present
              if get_value(set_type_hash, key) != nil
                Chef::Log.debug("Not setting #{@current_nesting_level.join("/")}/#{key} to #{value.inspect} because it has a #{@set_type} value already")
                return false
              end
            end

            # If we have been read, and the key we are writing is the same
            # as our parent, we have most like been ||='ed.  So we need to
            # just rewind a bit.
            #
            # In practice, these objects are single use - this is just
            # supporting one more single-use style.
            @current_nesting_level.pop if @has_been_read && @current_nesting_level.last == key

            set_value(set_type_hash, key, value)
            value
          end