/// <summary>
        /// Initializes a new instance of the <see cref="MessageProcessor"/> class.
        /// </summary>
        /// <param name="msgID">ID of the message to process. Must be non-zero.</param>
        /// <param name="methodDelegate">Delegate to the processing method.</param>
        /// <exception cref="ArgumentNullException"><paramref name="methodDelegate" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentOutOfRangeException"><paramref name="msgID"/> is zero.</exception>
        public MessageProcessor(MessageProcessorID msgID, MessageProcessorHandler methodDelegate)
        {
            if (methodDelegate == null)
                throw new ArgumentNullException("methodDelegate");

            if (msgID == 0)
                throw new ArgumentOutOfRangeException("msgID", "The message ID may not be zero.");

            _msgID = msgID;
            _call = methodDelegate;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="MessageProcessor"/> class.
        /// </summary>
        /// <param name="msgID">ID of the message to process. Must be non-zero.</param>
        /// <param name="methodDelegate">Delegate to the processing method.</param>
        /// <exception cref="ArgumentNullException"><paramref name="methodDelegate" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentOutOfRangeException"><paramref name="msgID"/> is zero.</exception>
        public MessageProcessor(MessageProcessorID msgID, MessageProcessorHandler methodDelegate)
        {
            if (methodDelegate == null)
            {
                throw new ArgumentNullException("methodDelegate");
            }

            if (msgID.GetRawValue() == 0)
            {
                throw new ArgumentOutOfRangeException("msgID", "The message ID may not be zero.");
            }

            _msgID = msgID;
            _call  = methodDelegate;
        }
 /// <summary>
 /// Creates a <see cref="IMessageProcessor"/>. Can be overridden in the derived classes to provide a different
 /// <see cref="IMessageProcessor"/> implementation. 
 /// </summary>
 /// <param name="atb">The <see cref="MessageHandlerAttribute"/> that was attached to the method that the
 /// <see cref="IMessageProcessor"/> is being created for.</param>
 /// <param name="handler">The <see cref="MessageProcessorHandler"/> for invoking the method.</param>
 /// <returns>The <see cref="IMessageProcessor"/> instance.</returns>
 protected virtual IMessageProcessor CreateMessageProcessor(MessageHandlerAttribute atb, MessageProcessorHandler handler)
 {
     return new MessageProcessor(atb.MsgID, handler);
 }
 /// <summary>
 /// Creates a <see cref="IMessageProcessor"/>. Can be overridden in the derived classes to provide a different
 /// <see cref="IMessageProcessor"/> implementation.
 /// </summary>
 /// <param name="atb">The <see cref="MessageHandlerAttribute"/> that was attached to the method that the
 /// <see cref="IMessageProcessor"/> is being created for.</param>
 /// <param name="handler">The <see cref="MessageProcessorHandler"/> for invoking the method.</param>
 /// <returns>The <see cref="IMessageProcessor"/> instance.</returns>
 protected virtual IMessageProcessor CreateMessageProcessor(MessageHandlerAttribute atb, MessageProcessorHandler handler)
 {
     return(new MessageProcessor(atb.MsgID, handler));
 }