# File lib/addressable/uri.rb, line 1260
    def query_values=(new_query_values)
      # Check for frozenness
      raise TypeError, "Can't modify frozen URI." if self.frozen?
      if !new_query_values.respond_to?(:to_hash)
        raise TypeError, "Can't convert #{new_query_values.class} into Hash."
      end
      new_query_values = new_query_values.to_hash

      # Algorithm shamelessly stolen from Julien Genestoux, slightly modified
      buffer = ""
      stack = []
      e = lambda do |component|
        component = component.to_s if component.kind_of?(Symbol)
        self.class.encode_component(component, CharacterClasses::UNRESERVED)
      end
      new_query_values.each do |key, value|
        if value.kind_of?(Hash)
          stack << [key, value]
        elsif value.kind_of?(Array)
          stack << [
            key,
            value.inject({}) { |accu, x| accu[accu.size.to_s] = x; accu }
          ]
        elsif value == true
          buffer << "#{e.call(key)}&"
        else
          buffer << "#{e.call(key)}=#{e.call(value)}&"
        end
      end
      stack.each do |(parent, hash)|
        (hash.sort_by { |key| key.to_s }).each do |(key, value)|
          if value.kind_of?(Hash)
            stack << ["#{parent}[#{key}]", value]
          elsif value == true
            buffer << "#{parent}[#{e.call(key)}]&"
          else
            buffer << "#{parent}[#{e.call(key)}]=#{e.call(value)}&"
          end
        end
      end
      @query = buffer.chop

      # Reset dependant values
      @normalized_query = nil
      @uri_string = nil
    end