Passando parâmetros para Event Handlers além do Event?

Outro dia o André Gil da DClick surgiu com uma pergunta interessante: Existe uma maneira de passar parâmetros para um Event Handler a não ser o Event? A resposta para esta pergunta é não. Mas embora a minha resposta para a pergunta tenha sido não, existe sim uma solução alternativa para o problema como mostrarei neste post.

Para exemplificar, o André precisava de algo mais ou menos assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    initialize="initApp()">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private function initApp():void
            {
                buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
                buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
            }

            private function buttonHandler(event:MouseEvent):void
            {
                // Pega a informação de acordo com o Botão que
                // disparou o evento
            }
        ]]>
    </mx:Script>

    <mx:Button id="buttonA" label="Button A"/>
    <mx:Button id="buttonB" label="Button B"/>

</mx:Application>

O trecho comentado no exemplo acima é o trecho sem solução e a solução alternativa para o problema pode ser vista no exemplo a seguir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    initialize="initApp()">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private function initApp():void
            {
                MouseEvent[buttonA.id] = "This is the button A";
                MouseEvent[buttonB.id] = "This is the button B";

                buttonA.addEventListener(MouseEvent.CLICK, buttonHandler);
                buttonB.addEventListener(MouseEvent.CLICK, buttonHandler);
            }

            private function buttonHandler(event:MouseEvent):void
            {
                Alert.show(MouseEvent[event.currentTarget.id]);
            }
        ]]>
    </mx:Script>

    <mx:Button id="buttonA" label="Button A"/>
    <mx:Button id="buttonB" label="Button B"/>

</mx:Application>

Como toda classe é um objeto dinâmico (public dynamic class Class) você pode atribuir métodos e propriedades dinamicamente às classes. É o que foi feito no exemplo acima onde duas propriedades cujos nomes correspondem aos ids dos componentes foram criadas na classe MouseEvent. Creio que o restante do código seja auto-explicativo.

Agora a pergunta que não quer calar: seria este mais uma pattern do Freaktionscript?