/// <summary>
        ///   Method invoked when (instead of) a new handler is removed from the target event.
        /// </summary>
        /// <param name="args">Context information.</param>
        public override void OnRemoveHandler(EventInterceptionArgs args)
        {
            // Remove the handler from our own list.
            if (RemoveHandler(args.Handler))
            {
                args.RemoveHandler(null);
            }

            // Remove the handler from the client.
            DelegateReferenceKeeper.RemoveReference(args.Handler);
        }
        /// <summary>
        ///   Method invoked when (instead of) a new handler is added to the target event.
        /// </summary>
        /// <param name="args">Context information.</param>
        public override void OnAddHandler(EventInterceptionArgs args)
        {
            // Add the handler to our own list.
            if (AddHandler(args.Handler))
            {
                args.AddHandler(null);
            }


            // Register the handler to the client to prevent garbage collection of the handler.
            DelegateReferenceKeeper.AddReference(args.Handler);
        }
        /// <summary>
        ///     Method invoked when (instead of) a new handler is removed from the target event.
        /// </summary>
        /// <param name="args">Context information.</param>
        public override void OnRemoveHandler(EventInterceptionArgs args)
        {
            // Remove the handler from our own list.
            if (RemoveHandler(args.Handler))
            {
                // If this is the last handler, remove the fake handler to ourselves from the target event.
                args.RemoveHandler(null);
            }

            // Remove the handler from the client.
            DelegateReferenceKeeper.RemoveReference(args.Handler);
        }
        /// <summary>
        ///     Method invoked when (instead of) a new handler is added to the target event.
        /// </summary>
        /// <param name="args">Context information.</param>
        public override void OnAddHandler(EventInterceptionArgs args)
        {
            // Add the handler to our own list.
            if (AddHandler(args.Handler))
            {
                // If it is the first handler we are adding, add a fake handler to ourselves to the target event.
                // Whichever handler will add here will be passed to OnInvokeHandler, so it is safe and convenient to pass null.
                args.AddHandler(null);
            }


            // Register the handler to the client to prevent garbage collection of the handler.
            DelegateReferenceKeeper.AddReference(args.Handler);
        }