public CrewViewModelCollection Clone(TankViewModelBase owner, TankViewModelCloneFlags flags)
        {
            var clone = new CrewViewModelCollection(_commandBindings);

            foreach (var crew in this)
            {
                var deepCopy = false;
                foreach (var role in crew.Crew.AllRoles)
                {
                    switch (role)
                    {
                    case CrewRoleType.Commander:
                        deepCopy = (flags & TankViewModelCloneFlags.Commander) == TankViewModelCloneFlags.Commander;
                        break;

                    case CrewRoleType.Driver:
                        deepCopy = (flags & TankViewModelCloneFlags.Driver) == TankViewModelCloneFlags.Driver;
                        break;

                    case CrewRoleType.Gunner:
                        deepCopy = (flags & TankViewModelCloneFlags.Gunner) == TankViewModelCloneFlags.Gunner;
                        break;

                    case CrewRoleType.Loader:
                        deepCopy = (flags & TankViewModelCloneFlags.Loader) == TankViewModelCloneFlags.Loader;
                        break;

                    case CrewRoleType.Radioman:
                        deepCopy = (flags & TankViewModelCloneFlags.Radioman) == TankViewModelCloneFlags.Radioman;
                        break;
                    }

                    if (deepCopy)
                    {
                        break;
                    }
                }

                if (deepCopy)
                {
                    clone.Add(crew.Clone(owner, crew.Index));
                }
                else
                {
                    clone.Add(crew);
                }
            }
            return(clone);
        }
        public virtual TankViewModelBase Clone(TankViewModelCloneFlags flags = TankViewModelCloneFlags.All)
        {
            var clone = (TankViewModelBase)this.MemberwiseClone();

            var cloneModules = (flags & TankViewModelCloneFlags.AnyModule) == TankViewModelCloneFlags.AnyModule;

            if (cloneModules)
            {
                clone.LoadedModules = (ModuleViewModels)this.LoadedModules.Clone(clone, flags);
                clone.AvailableGuns = new Dictionary <IGun, GunViewModel>(this.AvailableGuns);
            }

            var cloneEquipments = (flags & TankViewModelCloneFlags.Equipments) == TankViewModelCloneFlags.Equipments;

            if (cloneEquipments)
            {
                clone.LoadedEquipments = new ObservableCollection <IEquipmentViewModel>(this.LoadedEquipments);
                clone.HandleEquipmentsChangeEvents();
            }

            var cloneConsumables = (flags & TankViewModelCloneFlags.Consumables) == TankViewModelCloneFlags.Consumables;

            if (cloneConsumables)
            {
                clone.LoadedConsumables = new ObservableCollection <IConsumableViewModel>(this.LoadedConsumables);
                clone.HandleConsumablesChangeEvents();
            }

            var cloneCrews = (flags & TankViewModelCloneFlags.AnyCrew) == TankViewModelCloneFlags.AnyCrew;

            if (cloneCrews)
            {
                clone.Crews = clone.Crews.Clone(clone, flags);
                clone.HandleCrewSkillsChangedEvent();   // fixme: potential event memory leak, weak event required
            }

            if (cloneEquipments || cloneCrews)
            {
                clone.ModificationContext = this.ModificationContext.Clone();
            }

            clone.ClearEventHandlers();
            return(clone);
        }