using System;
namespace Wayne.Lib
{
    /// <summary>
    /// The EventArgs is used when ...
    /// </summary>
    public class ReserveCompletedEventArgs<TReserved> : AsyncCompletedEventArgs
    {
        #region Fields

        TReserved reservedObject;

        #endregion

        #region Construction

        /// <summary>
        /// Initializes a new instance of the class ReserveCompletedEventArgs where the reservation was successful.
        /// </summary>
        /// <param name="reservedObject">The reserved object.</param>
        /// <param name="userToken">An optional user token.</param>
        public ReserveCompletedEventArgs(TReserved reservedObject, object userToken)
            : base(true, userToken)
        {
            this.reservedObject = reservedObject;
        }

        /// <summary>
        /// Initializes a new instance of the class ReserveCompletedEventArgs where the reservation failed.
        /// </summary>
        /// <param name="userToken">An optional user token.</param>
        public ReserveCompletedEventArgs(object userToken)
            : base(false, userToken)
        {
        }

        #endregion

        #region Properties

        /// <summary>
        /// The reserved object.
        /// </summary>
        /// <exception cref="ObjectNotReservedException">There was no reserved object since the reservation failed.</exception>
        public TReserved ReservedObject
        {
            get
            {
                if (!Success)
                    throw new ObjectNotReservedException("There was no reserved object of the type " + typeof(TReserved).FullName + " since the reservation failed.");
                return reservedObject;
            }
        }

        #endregion
    }
}