Tout d'abord, la classe en question :

package com.phiphou.application
 
{
     
import com.phiphou.application.Customer;
import mx.collections.ArrayCollection;
import flash.events.EventDispatcher;
import mx.events.FlexEvent;
	
[Bindable]
public class Singleton extends EventDispatcher
{
	public function Singleton()
	{
			
	}
		
		
	private static var self:Singleton = new Singleton();
		
		
	public static function get instance() : Singleton
	{
		return self;
	}
		
		
	private var _ActualCustomer:Customer;
		
	[Bindable(event="CustomerChanged")]
		
	public function set ActualUser( customer:Customer ) : void
	{
		_ActualCustomer = customer;
			
		dispatchEvent( new FlexEvent("CustomerChanged") );
	}
 
	public function get ActualUser() : Customer
	{
		return _ActualCustomer;
	}
		
   }
}

Voyons maintenant comment l'utiliser. Imaginons le composant suivant :

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" layout="absolute">
<mx:Metadata>
	[Event(name="customerSelected",type="com.phiphou.events.CustomerEvent")]
</mx:Metadata>
	
<mx:Script>
<![CDATA[
 
	import mx.collections.ArrayCollection;
	import com.phiphou.application.Customer;
	import com.phiphou.events.CustomerEvent;
	import mx.events.ListEvent;
		
	[Bindable(event="customerSelected")]
	public var selectedCustomer:Customer;
		
	[Bindable]
	private var _dataProvider:ArrayCollection;
 
	public function set dataProvider( ac:ArrayCollection ) : void
	{
			_dataProvider = ac;
			_dataProvider.refresh();
	}
		
        public function get dataProvider() : ArrayCollection
	{
		return _dataProvider;
	}
	
		 
	private function onCustomerSelection() : void
	{
		selectedCustomer = customerList.selectedItem as Customer;
			
		dispatchEvent( new CustomerEvent("customerSelected",selectedCustomer) );
			
	}
	
]]>
</mx:Script>
 
<mx:DataGrid id="customerList" change="onCustomerSelection()">
<mx:columns>
	<mx:DataGridColumn headerText=""  width="30" dataField="customer_status" /> 
        <mx:DataGridColumn headerText="Nom" dataField="nom"/>
	<mx:DataGridColumn headerText="Email" dataField="customer_email" width="200"/>
</mx:columns>
<mx:dataProvider>
	{_dataProvider}
</mx:dataProvider>
</mx:DataGrid>
</mx:Panel>

Ce composant dispatche un event customerSelected de type CustomerEvent ( voir ici ) lorsque l'on clique sur un client dans le datagrid. Dans ce cas précis, je souhaite stocker le client actuel dans mon Singleton, afin d'y accéder depuis n'importe quel composant. Voici comment je m'y prends :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="319"
xmlns:forms="com.phiphou.forms.*" creationComplete="init()">
 
<forms:CustomerList id="customerList"
customerSelected="Singleton.instance.ActualUser=event.customer">
</forms:CustomerList>
	
<mx:Script>
	<![CDATA[
		
	import com.phiphou.events.*;
	import com.phiphou.application.*
			
		
	public function init( ) : void
	{
		Singleton.instance.addEventListener("CustomerChanged",onCustomerChange);
			
	}
		
			
	public function onCustomerChange( event:flash.events.Event=null ) : void
	{
		trace(Singleton.instance.ActualUser.customer_firstname);
			
	}
		
	]]>
</mx:Script>
 
<mx:TextArea right="10" top="10"  text="{Singleton.instance.ActualUser.customer_firstname}"/>
</mx:Application>

On voit ici qu'à la réception de l'event CustomerEvent, je stocke le client actuel dans mon Singleton, et je peux ensuite y accéder comme je veux. Soit directement, comme pour le champ texte, soit en spécifiant une fonction qui s'exécutera quand je stockerai le client dans le Singleton.

Cet exemple générait un avertissement (pas une erreur) en mode debug, nous indiquant que la classe n'était pas un eventDispatcher. Pourtant, celle-ci hérite bien d'EventDispatcher. Avec Flex 3 beta1, nous n'avons plus cet avertissement :-D