Вы должны использовать функцию внутри функции, чтобы правильно связать область видимости. Это своего рода хак в AS3. Лучше не спускаться по этой кроличьей норе, если вы можете ей помочь. Если нужно, хотя ...
for(var tool:Tool in _tools){
var getHandler(scope:Tool):Function{
var t:Tool = scope;
return function(e:MouseEvent):void{trace(t)}
}
tool.addEventListener(MouseEvent.CLICK, getHandler(tool));
}
РЕДАКТИРОВАТЬ: И, конечно, любые переменные, с которыми вам нужно работать в обработчике, также должны быть переданы в getHandler ... так что вместо того, чтобы просто принимать параметр области действия, вы также передали бы свой идентификатор, число, текущее состояние или что угодно.
EDIT2: Но задайте себе этот вопрос. Как вы удалите этот прослушиватель событий? Это самая главная причина, по которой я говорю, чтобы полностью избежать этой кроличьей норы. Это возможно, но обычно это гораздо сложнее, чем использовать более ООП способ решения этой проблемы, чем лямбда-функции.