private MeshNetworkMessageSubscriptionToken AddSubscriptionInternal<TMessage>(Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter, bool strongReference, IMeshNetworkMessageProxy proxy)
            where TMessage : class, IMeshNetworkMessage
        {
            if (deliveryAction == null)
                throw new ArgumentNullException("deliveryAction");

            if (messageFilter == null)
                throw new ArgumentNullException("messageFilter");

            if (proxy == null)
                throw new ArgumentNullException("proxy");

            lock (_SubscriptionsPadlock)
            {
                var subscriptionToken = new MeshNetworkMessageSubscriptionToken(this, typeof(TMessage));

                IMeshNetworkMessageSubscription subscription;
                if (strongReference)
                    subscription = new StrongMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter);
                else
                    subscription = new WeakMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter);

                _Subscriptions.Add(new SubscriptionItem(proxy, subscription));

                return subscriptionToken;
            }
        }
            /// <summary>
            /// Initializes a new instance of the WeakMeshMessageSubscription class.
            /// </summary>
            /// <param name="destination">Destination object</param>
            /// <param name="deliveryAction">Delivery action</param>
            /// <param name="messageFilter">Filter function</param>
            public WeakMeshNetworkMessageSubscription(MeshNetworkMessageSubscriptionToken subscriptionToken, Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter)
            {
                if (subscriptionToken == null)
                    throw new ArgumentNullException("subscriptionToken");

                if (deliveryAction == null)
                    throw new ArgumentNullException("deliveryAction");

                if (messageFilter == null)
                    throw new ArgumentNullException("messageFilter");

                _SubscriptionToken = subscriptionToken;
                _DeliveryAction = new WeakReference(deliveryAction);
                _MessageFilter = new WeakReference(messageFilter);
            }
        private void RemoveSubscriptionInternal<TMessage>(MeshNetworkMessageSubscriptionToken subscriptionToken)
            where TMessage : class, IMeshNetworkMessage
        {
            if (subscriptionToken == null)
                throw new ArgumentNullException("subscriptionToken");

            lock (_SubscriptionsPadlock)
            {
                var currentlySubscribed = (from sub in _Subscriptions
                                           where object.ReferenceEquals(sub.Subscription.SubscriptionToken, subscriptionToken)
                                           select sub).ToList();

                currentlySubscribed.ForEach(sub => _Subscriptions.Remove(sub));
            }
        }
            /// <summary>
            /// Initializes a new instance of the MeshMessageSubscription class.
            /// </summary>
            /// <param name="destination">Destination object</param>
            /// <param name="deliveryAction">Delivery action</param>
            /// <param name="messageFilter">Filter function</param>
            public StrongMeshNetworkMessageSubscription(MeshNetworkMessageSubscriptionToken subscriptionToken, Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter)
            {
                if (subscriptionToken == null)
                    throw new ArgumentNullException("subscriptionToken");

                if (deliveryAction == null)
                    throw new ArgumentNullException("deliveryAction");

                if (messageFilter == null)
                    throw new ArgumentNullException("messageFilter");

                _SubscriptionToken = subscriptionToken;
                _DeliveryAction = deliveryAction;
                _MessageFilter = messageFilter;
            }
 /// <summary>
 /// Unsubscribe from a particular message type.
 /// 
 /// Does not throw an exception if the subscription is not found.
 /// </summary>
 /// <param name="subscriptionToken">Subscription token received from Subscribe</param>
 public void Unsubscribe(MeshNetworkMessageSubscriptionToken subscriptionToken)
 {
     RemoveSubscriptionInternal<IMeshNetworkMessage>(subscriptionToken);
 }
 /// <summary>
 /// Unsubscribe from a particular message type.
 /// 
 /// Does not throw an exception if the subscription is not found.
 /// </summary>
 /// <typeparam name="TMessage">Type of message</typeparam>
 /// <param name="subscriptionToken">Subscription token received from Subscribe</param>
 public void Unsubscribe<TMessage>(MeshNetworkMessageSubscriptionToken subscriptionToken) where TMessage : class, IMeshNetworkMessage
 {
     RemoveSubscriptionInternal<TMessage>(subscriptionToken);
 }