В принципе, никто не мешает унаследоваться от того же Sprite'а, в классе реализовать все эти танцы с MOUSE_DOWN (подписаться в конструкторе), проверками на перетаскивание и т.д.
Наверх диспатчить кастомные(или стандартные MouseEvent.CLICK и т.д.) события, и наследовать все свои классы, требущие этот функционал от вышеописанного. Только в этом классе надо будет реализовать метод, который будет отписывать объекты от внутренних слушателей, чтобы GC смог потом все удалить.
Как-то так:

Код AS3:
public class MySprite extends Sprite
{
private var wasDragged:Boolean;
public function MySprite()
{
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}
public function free():void
{
removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseDown(event:MouseEvent):void
{
addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseMove(event:MouseEvent):void
{
wasDragged = true;
}
private function onMouseUp(event:MouseEvent):void
{
removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
if (!wasDragged)
{
dispatchEvent(new MouseEvent(MouseEvent.CLICK....));
}
}
}