Inheritance: Caliburn.Micro.PropertyChangedBase
        public ShellViewModel(
            SettingsViewModel settingsViewModelViewModel, 
            ExperienceContainer experienceContainer,
            ExpCardCalculatorViewModel expCardCalculatorViewModel,
            IWindowManager windowManager)
        {
            if (settingsViewModelViewModel == null)
            {
                throw new ArgumentNullException(nameof(settingsViewModelViewModel));
            }
            if (experienceContainer == null)
            {
                throw new ArgumentNullException(nameof(experienceContainer));
            }
            if (expCardCalculatorViewModel == null)
            {
                throw new ArgumentNullException(nameof(expCardCalculatorViewModel));
            }
            if (windowManager == null)
            {
                throw new ArgumentNullException(nameof(windowManager));
            }
            
            this.windowManager = windowManager;
            ExperienceContainer = experienceContainer;
            ExpCardCalculatorViewModel = expCardCalculatorViewModel;

            SettingsViewModel = settingsViewModelViewModel;
            SettingsViewModel.ActivateWith(this);

            experienceUpdateService = new ExperienceUpdateService();

            ExperienceComponents = new BindableCollection<IExperienceControl>(ExperienceContainer.ExperienceControls);
            timer.Tick += TimerOnTick;
        }
        protected override void Configure()
        {
            container = new SimpleContainer();

            container.Singleton<IWindowManager, MetroWindowManager>();
            container.Singleton<IEventAggregator, EventAggregator>();

            var baseExperienceData = new ExperienceData() { DisplayName = "Base Experience" };
            var classExperienceData = new ExperienceData() { DisplayName = "Class Experience" };
            IExperienceControl[] baseExperienceControls = GetExperienceControls(baseExperienceData, classExperienceData);

            ExperienceContainer experienceContainer = new ExperienceContainer(baseExperienceData, classExperienceData, baseExperienceControls);

            container.Handler<ShellViewModel>(simpleContainer =>
                                              new ShellViewModel(
                                                  container.GetInstance<SettingsViewModel>(),
                                                  experienceContainer,
                                                  new ExpCardCalculatorViewModel(experienceContainer),
                                                  container.GetInstance<IWindowManager>()));

            // TODO - refactor settings view model to just take a collection of menuitems
            container.Handler<SettingsViewModel>(simpleContainer => new SettingsViewModel(baseExperienceControls));
        }