Вобщем вот набросок, рабочий. Если кому надо, юзайте.

Код:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.external.*;
public class JSListener extends Sprite
{
private var externalHandlers = [];
static private var self;
static public function instance ():JSListener
{
if ( !self ) self = new JSListener ();
return self;
}
public function JSListener ():void
{
ExternalInterface.addCallback ( "addJSListener", addJSListener );
}
public function addJSListener ( eventName:String, functionName:Function ):void
{
externalHandlers = {};
if ( !( eventName in externalHandlers ) ) externalHandlers [ eventName ] = [];
externalHandlers [ eventName ].push ( functionName );
}
public function JSEvent ( ev, param1 = null, param2 = null ):void
{
var event:Array = ( ( externalHandlers [ ev.name ] || [] ) as Array ).concat ( ( externalHandlers [ '__all__' ] || [] ) as Array );
var o:Object = joinObjects ( param1, param2 );
for ( var i:uint = 0, len = event.length; i < len; i++ ) ExternalInterface.call ( event [ i ], o );
}
private function joinObjects ( a:Object, b:Object ):Object
{
var c:Object = {};
for ( var i in a ) c [ i ] = a [ i ];
for ( i in b ) c [ i ] = b [ i ];
return c;
}
}
}
В классе так же предусмотрен евент "__all__", это если JSхочет слушать все события.
Использовать можно например так:

Код:
var jsEvent = JSListener.instance ().JSEvent;
jsEvent( { type:"my_event" } );
Т.е. добавляем ссылку на синглтон в область видимости класса. И генерим события.
Единственное что смущает, это то что приходится создавать синглтон и проводить инициализацию. Может можно сделать более красивое решение?