/// <summary>
            /// Compiles the locale provider classes for the given locale files.
            /// </summary>
            /// <param name="code"></param>
            /// <param name="files"></param>
            /// <param name="accessor"></param>
            /// <returns></returns>
            internal static LocaleProviderType[] CompileLocaleFiles(Class code, LocaleFile[] files, string accessor)
            {
                // init
                LocaleFile[] defaultFiles = null;

                // find a list of all cultures (ordered by invariant, language, dialect)
                var cultures = files
                               .Select(x => (Culture)x.XmlLang)
                               .Concat(LocaleProvider.Defaults.Select(x => x.Culture))
                               .Distinct()
                               .OrderBy(x => x.ToString())
                               .ToArray();

                // render code
                var results = new List <LocaleProviderType>();

                foreach (var culture in cultures)
                {
                    // base class
                    var baseClass = results.SingleOrDefault(x => x.Culture == culture.Language) ?? results.FirstOrDefault();

                    // find file
                    var file = files.SingleOrDefault(x => x.XmlLang == culture);

                    // compile required?
                    LocaleProviderType result = null;
                    if (file == null && (baseClass == null || baseClass.IsPreCompiled))
                    {
                        // use the precompiled version
                        result = new LocaleProviderType(culture, null);
                    }
                    else
                    {
                        // compile required
                        if (file == null)
                        {
                            // get default files
                            if (defaultFiles == null)
                            {
                                defaultFiles = LocaleFile.Defaults;
                            }

                            // find default file
                            file = defaultFiles.Single(x => x.XmlLang == culture);
                        }

                        // compile
                        result = Compile(code, file, "{0}", baseClass, accessor, culture);
                    }

                    // add
                    results.Add(result);
                }

                // done
                return(results.ToArray());
            }
            /// <summary>
            /// Compiles the given locale into a nested class inside the Processor class.
            /// </summary>
            /// <param name="code"></param>
            /// <param name="classNameTemplate"></param>
            /// <param name="baseClass"></param>
            /// <param name="accessor"></param>
            /// <param name="culture"></param>
            /// <returns></returns>
            private static LocaleProviderType Compile(Class code, ILocale locale, string classNameTemplate, LocaleProviderType baseClass, string accessor, Culture culture)
            {
                // init
                var className = "@" + string.Format(classNameTemplate, culture.GetMethodName());

                // class
                using (var @class = code.AppendNestedClass("{0} class {1} : {2}", accessor, className, (baseClass == null ? "LocaleProvider" : baseClass.ClassName)))
                {
                    // summary
                    @class.Summary = (culture.IsInvariant ? "Invariant." : culture.ToString());

                    // ctor()
                    using (var block = @class.AppendMethod("public {0}() : base({1})", className, Compiler.GetLiteral(culture.ToString())))
                    {
                    }

                    // ctor(string culture)
                    using (var block = @class.AppendMethod("protected {0}(Culture culture) : base(culture)", className))
                    {
                    }

                    // style options
                    CompileStyleOptions(@class, locale.StyleOptions);

                    // date parts
                    CompileDatePartParameters(@class, locale.Dates, DateFormat.Numeric);
                    CompileDatePartParameters(@class, locale.Dates, DateFormat.Text);

                    // ordinals
                    CompileOrdinals(@class, locale.Terms);
                    CompileLongOrdinals(@class, locale.Terms);

                    // terms
                    CompileTerms(@class, locale.Terms);
                    CompileTermGender(@class, locale.Terms);
                }

                // done
                return(new LocaleProviderType(culture, className));
            }