public static Type[] LoadTypesFromPlugins(Preferences preferences)
        {
            var config = new CodeGeneratorConfig();

            config.Configure(preferences);
            var resolver = new AssemblyResolver(AppDomain.CurrentDomain, config.searchPaths);

            foreach (var path in config.plugins)
            {
                resolver.Load(path);
            }

            return(resolver.GetTypes());
        }
        public static CodeGenerator CodeGeneratorFromPreferences(Preferences preferences)
        {
            var config = new CodeGeneratorConfig();

            config.Configure(preferences);

            var types = LoadTypesFromPlugins(preferences);

            var dataProviders  = GetEnabledInstances <ICodeGeneratorDataProvider>(types, config.dataProviders);
            var codeGenerators = GetEnabledInstances <ICodeGenerator>(types, config.codeGenerators);
            var postProcessors = GetEnabledInstances <ICodeGenFilePostProcessor>(types, config.postProcessors);

            configure(dataProviders, preferences);
            configure(codeGenerators, preferences);
            configure(postProcessors, preferences);

            return(new CodeGenerator(dataProviders, codeGenerators, postProcessors));
        }