This is the second in a 3 parter about the flex singleton register. This post will look at how to register your own classes with the Singleton register so you can actually use your custom implementations instead of the Flex default implementations.
The first post on the Singleton register can be found here
Registering custom implementations - the problem The last post showed that you simply use:
Singleton.registerClass("mx.managers::IPopUpManager", mx.managers.PopUpManagerImpl);
So, in theory you just add in your own class. The problem is the Singleton.registerClass
method works on a first come first serve basis - once a class is registered against an interface, no subsequent classes can be registered.
All the Flex default implementations are registered as the framework is initialized (in SystemManager.mx_internal::docFrameHandle
). So, there is no chance for you to register your own implementation.
Registering custom implementations - the solution Create a custom preloader for the main Flex application. If you define your own preloader, you can register classes BEFORE the SystemManager registers the Flex classes.
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" preloader="com.myDomain.preloaders.ApplicationPreloader" >
And then in your preloader...
package com.myDomain.preloaders
{
import mx.core.Singleton;
import mx.preloaders.DownloadProgressBar;
public class ApplicationPreloader extends DownloadProgressBar
{
private static var classConstructed:Boolean = staticInitializer();
private static function staticInitializer():Boolean {
Singleton.registerClass("mx.managers::IPopUpManager",
com.myDomain.managers.MyCustomPopUpManagerImpl); return true;
}
}
}
And now we have registered our implementations before Flex does!
To tidy things up you could have a static class that does all the reigstration, and in this preloader simply call com.myDomain.manager.SingletonImplManager.register();
.