Observer + 2 метода у пользовательского интерфейса
Причем, Вы сможете искать какие угодно объекты, главное чтобы они реализрвали интерфейс поиска
Никаких сканирований, никаких рекурсия, зачем эта головная боль
Мне кажется все ГОРАЗДО проще
Ведь ВЫ ищите ИМЯ
интерфейс поиска

Код AS3:
package interfaces
{
public interface ISearchableElement
{
function set searchName(val:String):void;
function get searchName():String;
}
}
Observer

Код AS3:
package managers
{
import interfaces.ISearchableElement;
public class SearchManager
{
private static var instance:SearchManager;
protected var _elements:Vector.<ISearchableElement>=new Vector.<ISearchableElement>();
public static function getInstance():SearchManager
{
if (instance == null)
{
instance = new SearchManager();
}
return instance;
}
public function addSearchableElement(val:ISearchableElement):void
{
_elements.push(val);
}
public function searchByName(name:String):Vector.<ISearchableElement>
{
var elements:Vector.<ISearchableElement>=new Vector.<ISearchableElement>();
var i:int;
var currElement:ISearchableElement;
var total:int=_elements.length;
for(i=0;i<total;i++)
{
if(_elements[i].searchName==name)
{
elements.push(_elements[i]);
}
}
return elements;
}
}
}
DisplayObject

Код AS3:
package DisplayObject
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import interfaces.ISearchableElement;
import managers.SearchManager;
public class SearchableDisplayObject extends Sprite implements ISearchableElement
{
protected var _searchName:String;
public function SearchableDisplayObject()
{
addEventListener(Event.ADDED_TO_STAGE,addedToStageHandler);
}
public function set searchName(val:String):void
{
_searchName=val;
}
public function get searchName():String
{
return _searchName;
}
protected function addedToStageHandler(event:Event):void
{
SearchManager.getInstance().addSearchableElement(this);
}
}
}
Использование

Код AS3:
package
{
import DisplayObject.SearchableDisplayObject;
import flash.display.Sprite;
import interfaces.ISearchableElement;
import managers.SearchManager;
public class UnlimDeepDOSearch extends Sprite
{
protected var _searchManager:SearchManager=SearchManager.getInstance();
public function UnlimDeepDOSearch()
{
var mySearchableDO1:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO1.searchName="child711";
var mySearchableDO2:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO2.searchName="child2";
var mySearchableDO3:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO3.searchName="child0";
var mySearchableDO4:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO4.searchName="child1";
var mySearchableDO5:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO5.searchName="child711";
var mySearchableDO6:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO6.searchName="child1";
var mySearchableDO7:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO7.searchName="child14";
var mySearchableDO8:SearchableDisplayObject=new SearchableDisplayObject();
mySearchableDO8.searchName="child1";
(mySearchableDO5 as Sprite).addChild(mySearchableDO7);
(mySearchableDO5 as Sprite).addChild(mySearchableDO8);
(mySearchableDO1 as Sprite).addChild(mySearchableDO5);
(mySearchableDO1 as Sprite).addChild(mySearchableDO6);
addChild(mySearchableDO1);
addChild(mySearchableDO2);
addChild(mySearchableDO3);
addChild(mySearchableDO4);
var searchChild1:Vector.<ISearchableElement>=_searchManager.searchByName("child1");
trace("'child1' total "+searchChild1.length);
var searchChild14:Vector.<ISearchableElement>=_searchManager.searchByName("child14");
trace("'child14' total "+searchChild14.length);
var searchChild711:Vector.<ISearchableElement>=_searchManager.searchByName("child711");
trace("'child711' total "+searchChild711.length);
}
}
}
трэйс

Код AS1/AS2:
'child1' total 3
'child14' total 1
'child711' total 2