using System;
namespace Wayne.Lib
{
    /// <summary>
    /// A generic event args holding an argument of some type.
    /// </summary>
    /// <typeparam name="T">The event argument.</typeparam>
    public class EventArgs<T> : EventArgs
    {
        #region Fields

        private T argument;

        #endregion

        #region Construction

        /// <summary>
        /// Construction.
        /// </summary>
        /// <param name="argument">The event argument.</param>
        public EventArgs(T argument)
        {
            this.argument = argument;
        }

        #endregion

        #region Properties

        /// <summary>
        /// The event argument.
        /// </summary>
        public T Argument
        {
            get { return argument; }
        }

        #endregion

        #region Debug methods

        /// <summary>
        /// Presents the class as a string.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format(System.Globalization.CultureInfo.InvariantCulture,
                "EventArgs<{0}>({1})", argument.GetType().Name, argument);
        }

        #endregion
    }

    /// <summary>
    /// A generic event args holding an argument of some type.
    /// </summary>
    /// <typeparam name="TArgument">The event argument.</typeparam>
    /// <typeparam name="TSender">The event sender.</typeparam>
    public class EventArgs<TSender, TArgument> : EventArgs
    {
        /// <summary>
        /// Construction.
        /// </summary>
        /// <param name="sender">The sender</param>
        /// <param name="argument">The event argument.</param>
        public EventArgs(TSender sender, TArgument argument)
        {
            Sender = sender;
            Argument = argument;
        }

        /// <summary>
        /// The event argument.
        /// </summary>
        public TArgument Argument { get; private set; }

        /// <summary>
        /// The event sender.
        /// </summary>
        public TSender Sender { get; private set; }

        /// <summary>
        /// Presents the class as a string.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format(System.Globalization.CultureInfo.InvariantCulture,
                "EventArgs<{0},{1}>({2}, {3})", Sender.GetType().Name, Argument.GetType().Name, Sender, Argument);
        }
    }
}