namespace Caliburn.Micro.Core {
    /// 
    /// A base class for various implementations of  that maintain an active item.
    /// 
    /// The type that is being conducted.
    public abstract class ConductorBaseWithActiveItem : ConductorBase, IConductActiveItem where T: class {
        T activeItem;
        /// 
        /// The currently active item.
        /// 
        public T ActiveItem {
            get { return activeItem; }
            set { ActivateItem(value); }
        }
        /// 
        /// The currently active item.
        /// 
        /// 
        object IHaveActiveItem.ActiveItem {
            get { return ActiveItem; }
            set { ActiveItem = (T)value; }
        }
        /// 
        /// Changes the active item.
        /// 
        /// The new item to activate.
        /// Indicates whether or not to close the previous active item.
        protected virtual void ChangeActiveItem(T newItem, bool closePrevious) {
            ScreenExtensions.TryDeactivate(activeItem, closePrevious);
            newItem = EnsureItem(newItem);
            if(IsActive)
                ScreenExtensions.TryActivate(newItem);
            activeItem = newItem;
            NotifyOfPropertyChange("ActiveItem");
            OnActivationProcessed(activeItem, true);
        }
    }
}