public AlbumDescriptor  Visit(IAlbumDescriptorBuilder iBuilder)
        {
            bool res = PrivateVisit(iBuilder);
            if (res == false)
                return null;

            return iBuilder.Mature();
        }
        protected override bool PrivateVisit(IAlbumDescriptorBuilder iab)
        {
            if (_Path == null)
                return false;

            foreach (string tbp in _Path)
            {
                string[] splitted = tbp.Split(new char[] { '=' });
                if (splitted.Length != 2)
                    continue;

                Match m = _Indexed.Match(splitted[0]);
                if (m.Success)
                {
                    IAttributeObjectBuilder<TrackDescriptor> track = iab.DescribeNewTrack();
                    track.DescribeAttribute("TNUMBER", () => m.Groups[2].Value);
                    track.DescribeAttribute(m.Groups[1].Value, () => splitted[1]);
                    track.Mature();
                    continue;
                }

                if (splitted[0] == _DTitle)
                {
                    string[] splitted2 = splitted[1].Split(new char[] { '/' });

                    int l = splitted2.Length;

                    if ((l != 1) && (l != 2))
                        return false;

                    iab.DescribeAttribute(string.Format("{0}0",splitted[0]), () => splitted2[0].Trim());
                    iab.DescribeAttribute(string.Format("{0}1", splitted[0]), () => ((l == 2) ? splitted2[1] : splitted2[0]).Trim());
                 
                    continue;
                }
                    
                iab.DescribeAttribute(splitted[0], ()=>splitted[1]);
                
            }

            return true;
        }
 protected abstract bool PrivateVisit(IAlbumDescriptorBuilder iab);
        protected override bool PrivateVisit(IAlbumDescriptorBuilder iab)
        {
            if (iab == null)
                return false;

            IAttributeObjectDescriber currentobjecr = iab;
            int filenumber = 0;

            using (StreamReader tr = new StreamReader(_Path, Encoding.Default))
            {
                string lign;
                while ((lign = tr.ReadLine()) != null)
                {
                    lign = lign.NormalizeSpace();
                    Match m = _Reader.Match(lign);
                    if (m.Success)
                    {
                        List<string> res = (from g in m.Groups.Cast<Group>().Where(ma => ma.Success).Skip(1)
                                            from c in g.Captures.Cast<Capture>()
                                            orderby c.Index
                                            select c.Value).ToList();

                        string attribute = res[0];
                        switch (attribute)
                        {
                            case _Track:
                                IAttributeObjectBuilder<ITrackDescriptor> old = currentobjecr as IAttributeObjectBuilder<ITrackDescriptor>;
                                if (old != null)
                                {
                                    old.Mature();
                                }

                                currentobjecr = iab.DescribeNewTrack();

                                if (res.Count != 3)
                                    return false;

                                currentobjecr.DescribeAttribute(attribute, () => res[1]);
                                continue;

                            case _Comment:
                                if (res.Count != 3)
                                    continue;

                                currentobjecr.DescribeAttribute(res[1], () => res[2]);
                                continue;

                            case _File:
                                filenumber++;
                                if (filenumber > 1)
                                    return false;
                                break;

                            case _Index:
                                if (res.Count != 3)
                                    return false;

                                if (!m.Groups[2].Success)
                                    continue;

                                currentobjecr.DescribeAttribute(string.Format("{0} {1}", res[0], res[1]), () => res[2]);
                                continue;
                        }

                        currentobjecr.DescribeAttribute(attribute, () => res[1]);

                    }

                }
            }

            IAttributeObjectBuilder<ITrackDescriptor> last = currentobjecr as IAttributeObjectBuilder<ITrackDescriptor>;
            if (last != null)
            {
                last.Mature();
            }

            return (filenumber == 1);
        }