def self.encode(channel, payload, user_headers, exchange, routing_key, mandatory, immediate, frame_size)
ticket = 0
buffer = ''
buffer << @packed_indexes
buffer << [ticket].pack(PACK_UINT16)
buffer << exchange.bytesize.chr
buffer << exchange
buffer << routing_key.bytesize.chr
buffer << routing_key
bit_buffer = 0
bit_buffer = bit_buffer | (1 << 0) if mandatory
bit_buffer = bit_buffer | (1 << 1) if immediate
buffer << [bit_buffer].pack(PACK_CHAR)
frames = [MethodFrame.new(buffer, channel)]
properties, headers = self.split_headers(user_headers)
if properties.nil? or properties.empty?
raise RuntimeError.new("Properties can not be empty!")
end
properties_payload = Basic.encode_properties(payload.bytesize, properties)
frames << HeaderFrame.new(properties_payload, channel)
frames + self.encode_body(payload, channel, frame_size)
end