# File lib/amq/protocol/client.rb, line 1656
        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)
          # TODO: what shall I do with the headers?
          if properties.nil? or properties.empty?
            raise RuntimeError.new("Properties can not be empty!") # TODO: or can they?
          end
          properties_payload = Basic.encode_properties(payload.bytesize, properties)
          frames << HeaderFrame.new(properties_payload, channel)
          frames + self.encode_body(payload, channel, frame_size)
        end