Что касается диспатчера - это просто расширенная событийная модель, вот и все ...

Код:
import mx.events.EventDispatcher;
// ************************************************
function onEvent():Void
{
trace("onEvent");
}
var listener:Object = new Object();
listener.event = function():Void
{
trace("listener.event");
}
listener.handleEvent = function(event:Object):Void
{
switch(event.type)
{
case("event"):
trace("listener.handleEvent");
break;
}
}
var dispatcher:Object = new Object();
EventDispatcher.initialize(dispatcher);
dispatcher.addEventListener("event", onEvent);
dispatcher.addEventListener("event", listener);
dispatcher.eventHandler = function():Void
{
trace("Dispatcher.eventHandler");
}
// ************************************************
dispatcher.dispatchEvent({type:"event"});
Где-то она полезна, где-то излишни ...
Что касается MovieClip.onDblClick - опять же зачем городить?
Ну ни кто ведь не отменял прототипы, и та же ММ их использует в своих классах ... во всяком случае, в, примерно, таком виде ...

Код:
class mx.Extensions.MovieClipExtensions
{
static function addDrawingAPI():Void
{
MovieClip.prototype.drawCircle = function (x:Number, y:Number, radius:Number):Void
{
// ...
}
}
}
// и далее когда необходимо подключаем это ...
import mx.Extensions.MovieClipExtensions;
MovieClipExtensions.addDrawingAPI();
Да есть момент, что MovieClip - это dynamic class, но не важно, кто мешает для того же String, залезть в String.as и добавить либо ключевое слово dynamic, или зарезервировать местечко для своего метода, типа:
function hello():Void;
И далее в подключаемом StringExtension уже его определить ...
Кстати если поставить себе Central SDK - то можно увидеть как обновится тот же String.as (function replace( re:String, repl:String ):String; // Central API)
Вобщем будте проще
