static string[] initPhase <T>(Assembly assembly, out string[] availableTypes, out string[] availableNames) where T : ICodeGeneratorInterface
        {
            var instances = CodeGeneratorUtil
                            .GetOrderedTypes <T>(assembly)
                            .Where(type => !type.IsAbstract)
                            .Select(type => (T)Activator.CreateInstance(type));

            if (typeof(T) == typeof(ICodeGenFilePostProcessor))
            {
                instances = instances
                            .OrderBy(instance => ((ICodeGenFilePostProcessor)instance).priority);
            }
            else
            {
                instances = instances
                            .OrderBy(instance => instance.name);
            }

            availableTypes = instances
                             .Select(instance => instance.GetType().FullName)
                             .ToArray();

            availableNames = instances
                             .Select(instance => instance.name)
                             .ToArray();

            return(instances
                   .Where(instance => instance.isEnabledByDefault)
                   .Select(instance => instance.GetType().FullName)
                   .ToArray());
        }