namespace Swan.Messaging
{
    using System;
    /// 
    /// Base class for messages that provides weak reference storage of the sender.
    /// 
    public abstract class MessageHubMessageBase
        : IMessageHubMessage
    {
        /// 
        /// Store a WeakReference to the sender just in case anyone is daft enough to
        /// keep the message around and prevent the sender from being collected.
        /// 
        private readonly WeakReference _sender;
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The sender.
        /// sender.
        protected MessageHubMessageBase(object sender)
        {
            if (sender == null)
                throw new ArgumentNullException(nameof(sender));
            _sender = new WeakReference(sender);
        }
        /// 
        public object Sender => _sender.Target;
    }
    /// 
    /// Generic message with user specified content.
    /// 
    /// Content type to store.
    public class MessageHubGenericMessage
        : MessageHubMessageBase
    {
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The sender.
        /// The content.
        public MessageHubGenericMessage(object sender, TContent content)
            : base(sender)
        {
            Content = content;
        }
        /// 
        /// Contents of the message.
        /// 
        public TContent Content { get; protected set; }
    }
}