using System;
using System.Threading.Tasks;

namespace MediaBrowser.Controller.Events
{
    /// <summary>
    /// An interface that handles eventing.
    /// </summary>
    public interface IEventManager
    {
        /// <summary>
        /// Publishes an event.
        /// </summary>
        /// <param name="eventArgs">the event arguments.</param>
        /// <typeparam name="T">The type of event.</typeparam>
        void Publish<T>(T eventArgs)
            where T : EventArgs;

        /// <summary>
        /// Publishes an event asynchronously.
        /// </summary>
        /// <param name="eventArgs">The event arguments.</param>
        /// <typeparam name="T">The type of event.</typeparam>
        /// <returns>A task representing the publishing of the event.</returns>
        Task PublishAsync<T>(T eventArgs)
            where T : EventArgs;
    }
}