/// <summary>
        ///     Notifies listener about an event.
        /// </summary>
        /// <param name="target">The specified listener to notify.</param>
        /// <param name="sender">The object that raised the event.</param>
        /// <param name="message">The message instance.</param>
        public static void Publish([NotNull] object target, [NotNull] object sender, [NotNull] object message)
        {
            Should.NotBeNull(target, "target");
            Should.NotBeNull(sender, "sender");
            Should.NotBeNull(message, "message");
            var handlerInfo = HandlerInfo.GetOrCreate(target);

            if (!handlerInfo.IsEmpty)
            {
                handlerInfo.Handle(sender, message, message is ITracebleMessage);
            }
            var customAction = PublishCustomAction;

            if (customAction != null)
            {
                customAction(target, sender, message);
            }
        }
        /// <summary>
        ///     Subscribes an instance to events.
        /// </summary>
        /// <param name="instance">The instance to subscribe for event publication.</param>
        public virtual bool Subscribe(object instance)
        {
            Should.NotBeNull(instance, "instance");
            var handlerInfo = HandlerInfo.GetOrCreate(instance);

            if (handlerInfo.IsEmpty)
            {
                return(false);
            }
            lock (_handlerReferences)
            {
                if (!Contains(instance, false))
                {
                    _handlerReferences.Add(ServiceProvider.WeakReferenceFactory(handlerInfo, true));
                }
            }
            return(true);
        }