/// <summary>
        /// Sends the specified messages to a Bayeux server asynchronously.
        /// </summary>
        /// <param name="listener">The listener used to process the request response.</param>
        /// <param name="messages">The list of messages will be sent in one request.</param>
        public virtual void Send(ITransportListener listener, params IMutableMessage[] messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            List <IMutableMessage> validMessages = new List <IMutableMessage>();

            foreach (IMutableMessage message in messages)
            {
                if (message != null)
                {
                    string msgId = message.Id;
                    if (String.IsNullOrEmpty(msgId))
                    {
                        msgId      = _session.NewMessageId();
                        message.Id = msgId;
                    }

                    if (!String.IsNullOrEmpty(_clientId))                    // TODO: && String.IsNullOrEmpty(message.ClientId)
                    {
                        message.ClientId = _clientId;
                    }

                    if (_session.ExtendSend(message))
                    {
                        // Extensions may have modified the messageId, but we need to own
                        // the messageId in case of meta messages to link request/response
                        // in non request/response transports such as websocket
                        message.Id = msgId;

                        validMessages.Add(message);
                    }
                }
            }

            if (validMessages.Count > 0)
            {
                // DEBUG
                Debug.Print("Sending messages: {0}", ObjectConverter.Serialize(validMessages));

                _transport.Send(listener, validMessages.ToArray());
            }
        }