Voici la méthode pour créer un singleton en AS3 (nous appelerons notre class "Notifieur"):

package neoia.myrddin
{
	import flash.events.EventDispatcher;
	
	public class Notifieur extends EventDispatcher
	{
		private static var instance:Notifieur;
		
		public function Notifieur()
		{
			super();
		}
		
		/**
		 * Singleton EventHandler
		 */
		public static function getInstance() : Notifieur {
			if ( instance == null ) instance = new Notifieur( );
			return instance as Notifieur;
		}

	}
}

Notifieur hérite de EventDispatcher afin d'écouter des événements.

Et voici comment l'instancier :

import neoia.myrddin.Notifieur;

private var notifieur:Notifieur;

// méthode appelée lors du creationComplete du composant
private function init():void
{
	notifieur = Notifieur.getInstance();
}

Nous avons donc notre Notifieur. Ensuite, nous créons une nouvelle classe, que nous nommons pour l'exemple Notification. Cette classe hérite de la classe Event et va nous permettre d'envoyer nos propres événements du type "l'utilisateur s'est connecté".

Voici la classe Notification.as :

package neoia.myrddin
{
	import flash.events.Event;
	
	public class Notification extends Event {
		
		public static const USER_LOGGED:String = "User logged";
		
		public var data:Object;
		
		public function Notification(type:String, data:Object=null) {
			super(type,true);
			
			this.data = data;
		}
	}
}

Vous remarquerez qu'il y'a deux types de propriétés au constructeur, le type et data, un Object qui nous permet par exemple d'envoyer en même temps que l'événement une variable (l'id de l'utilisateur par exemple).

Maintenant que nous avons nos deux classes, voyons voir comment travailler avec cette méthode :

Voici un exemple de la hierarchie de notre projet :

- Main
	- Login
	- Panel MachinTruc

Nous voulons envoyer un événement (notification) du composant Login à Panel MachinTruc une fois que l'utilisateur s'est loggué.

Dans MachinTruc :

private function init():void
{
	// initialisation de la NOTIFICATION
	notifieur = Notifieur.getInstance();
	
	notifieur.addEventListener(Notification.USER_LOGGED,onUserLogged);
}

/**
 * Méthode listened
 * Au moment où un user se loggue, on ...
 */
private function onUserLogged(e:Notification):void
{
	// votre code
}

Et dans Login (on envoie notre notification) :

notifieur.dispatchEvent(new Notification(Notification.USER_LOGGED));

Et voili voulou. Plus besoin de réfléchir à comment est constituer la displayList du projet. Je n'ai pas encore testé à fond de chez fond cette méthode, mais elle a l'air de bien marcher sur tous les projets que je réalise actuellement.

En espérant que cela vous soit utile. Si vous avez des questions, n'hésitez pas !