class Trenni::Reference

def append(buffer)

def append(buffer)
	buffer << escape_path(@path)
	
	unless @query.empty?
		buffer << '?' << query_string
	end
	
	if @fragment
		buffer << '#' << escape(@fragment)
	end
	
	return buffer
end

def build_nested_query(value, prefix = nil)

def build_nested_query(value, prefix = nil)
	case value
	when Array
		value.map { |v|
			build_nested_query(v, "#{prefix}[]")
		}.join("&")
	when Hash
		value.map { |k, v|
			build_nested_query(v, prefix ? "#{prefix}[#{escape(k.to_s)}]" : escape(k.to_s))
		}.reject(&:empty?).join('&')
	when nil
		prefix
	else
		raise ArgumentError, "value must be a Hash" if prefix.nil?
		"#{prefix}=#{escape(value.to_s)}"
	end
end

def escape(string)

Escapes a generic string, using percent encoding.
def escape(string)
	encoding = string.encoding
	string.b.gsub(/([^a-zA-Z0-9_.\-]+)/) do |m|
		'%' + m.unpack('H2' * m.bytesize).join('%').upcase
	end.force_encoding(encoding)
end

def escape_path(path)

def escape_path(path)
	encoding = path.encoding
	path.b.gsub(NON_PCHAR) do |m|
		'%' + m.unpack('H2' * m.bytesize).join('%').upcase
	end.force_encoding(encoding)
end

def initialize(path, query = {}, fragment: nil)

def initialize(path, query = {}, fragment: nil)
	@path = path.to_s
	@query = query
	@fragment = fragment
end

def query_string

def query_string
	build_nested_query(@query)
end

def to_str

def to_str
	append(String.new)
end