internal int Compare(Genre one, Genre two)
        {
            if (one == two)
                return 0;

            if ((one.IsEmpty) || (two.IsEmpty))
                return int.MaxValue;

            return _Dic.FindOrCreateEntity(new SimpleCouple<Genre>(one, two), c => one.ComputeCompare(two));
        }
        private Album(AlbumDescriptorDecorator add, bool InjectImages=false)
            : this(add.ImportContext)
        {
            _Name = add.CorrectName;
            _Genre = add.MainGenre;

            _TracksNumber = add.TracksNumber;
            _DateAdded = DateTime.Now;
            _Year = add.Year;
            _Maturity = add.Maturity;

            CDIDs = add.IDs;

            if (InjectImages)
                this.ImportImageFromDescriptor(add.Wrapped as IFullAlbumDescriptor);

            if (add.Artists != null)
            {
                ArtistHandler.ModelCollection.AddCollection(add.Artists);
            }

            
        }
 private Genre(string iName, Genre iFather, IInternalMusicSession msi)
 {
     _Name = iName;
     _Father = iFather;
     msi.Genres.Register(this);
  }
 private Genre(string iName, IInternalMusicSession msi)
 {
     _Name = iName;
     _Father = null;
     _Session = msi;
  }
        public int ComputeCompare(Genre other)
        {
            Genre realo = other as Genre;

            if (realo == null)
                return int.MaxValue;

            if (realo == this)
                return 0;

            var Yours = realo.Fathers;

            IGenre commun = Fathers.Intersect(Yours).FirstOrDefault();

            if (commun == null)
                return int.MaxValue;

            return (Fathers.Index(commun) + Yours.Index(commun));
        }
        private Genre PrivateAddSubGenre(string iName)
        {
            string newname = iName.TitleLike();

            if (_Genres == null)
                _Genres = new  List<Genre>();
            else
            {
                var res = (from g in _Genres where g.Name == newname select g).ToList();
                if (res.Count > 1)
                    throw new Exception("Algo error");
                if (res.Count == 1)
                    return res[0];
            }

            Genre novo = new Genre(newname, this, _Session);
            GenresHandler.ModelCollection.Add(novo);
            //_Genres.Add(novo);
            return novo;
        }
        static internal Genre GetGenre(string name, IInternalMusicSession Session, bool iCreateIfNecessary)
        {
            if (name == null)
                return null;

            if (!iCreateIfNecessary)
                return Session.Genres.Find(name);


            Eplucheur epl = new Eplucheur(name);
            Genre MySelfOrFather = null;

            foreach(string st in epl.Depile())
            {
                MySelfOrFather = Session.Genres.Find(st);
                if (MySelfOrFather != null)
                    break;
            }

            foreach(string st in epl.Rempile())
            {
                if (MySelfOrFather == null)
                {
                    MySelfOrFather = new Genre(st, null, Session);
                }
                else
                    MySelfOrFather =  MySelfOrFather.PrivateAddSubGenre(st);
            }

            return MySelfOrFather;
        }
        static internal Genre CreateDummy(IInternalMusicSession Session)
        {
            if (_Dummy == null)
            {
                _Dummy = new Genre(string.Empty, Session);
            }

            return _Dummy;
        }
 internal void Register(Genre genre)
 {
     _AllGenres.Register(genre);
     _Genres.Add(genre);
     genre.Session = Session;
 }