public static void Init()
 {
     // Hack: Internal property needs to be reset
     PageTypeResolverInstanceProperty.SetValue(null, null, null);
     Initializer.Start();
     if (!_firstInit)
     {
         var synchronizer = new PageTypeSynchronizer(new PageTypeDefinitionLocator(),
                                                     new PageTypeBuilderConfiguration());
         // HACK: Requried because SynchronizePageTypes is internal.
         SynchronzePageTypesMethod.Invoke(synchronizer, new object[0]);
     }
     _firstInit = false;
 }
        public void Initialize(InitializationEngine context)
        {
            var assemblyLocator = new AppDomainAssemblyLocator();
            var pageTypeLocator = new PageTypeLocator(new PageTypeFactory());
            var pageTypeDefinitionLocator = new PageTypeDefinitionLocator(
                assemblyLocator);
            var pageTypeUpdater = new PageTypeUpdater(
                pageTypeDefinitionLocator,
                new PageTypeFactory(), 
                new PageTypeValueExtractor(),
                pageTypeLocator);
            var globalPropertySettingsLocator = new GlobalPropertySettingsLocator(assemblyLocator);
            var propertySettingsRepository = new PropertySettingsRepository();
            var pageTypePropertyUpdater = new PageTypePropertyUpdater(
                new PageDefinitionFactory(),
                new PageDefinitionTypeFactory(), 
                new TabFactory(),
                propertySettingsRepository,
                globalPropertySettingsLocator);

            var tabDefinitionUpdater = new TabDefinitionUpdater(new TabFactory());

            var tabLocator = new TabLocator(assemblyLocator);

            PageTypeSynchronizer synchronizer = new PageTypeSynchronizer(
                pageTypeDefinitionLocator, 
                Configuration,
                pageTypePropertyUpdater,
                new PageTypeDefinitionValidator(new PageDefinitionTypeMapper(new PageDefinitionTypeFactory())), 
                PageTypeResolver.Instance,
                pageTypeLocator,
                pageTypeUpdater,
                tabDefinitionUpdater,
                tabLocator,
                new GlobalPropertySettingsSynchronizer(propertySettingsRepository, globalPropertySettingsLocator));
            synchronizer.SynchronizePageTypes();

            DataFactory.Instance.LoadedPage += DataFactory_LoadedPage;
            DataFactory.Instance.LoadedChildren += DataFactory_LoadedChildren;
            DataFactory.Instance.LoadedDefaultPageData += DataFactory_LoadedPage;
        }