I'm not using this method anymore but I'll put it here for whoever wants it.
$TSObject::Count = 0;
function TSObject()
{
%idx = $TSObject::Count + 1;
$TSObject::exists[%idx] = 1;
$TSObject::childCount[%idx] = 0;
$TSObject::Count ++;
return %idx;
}
function TSObject::delete(%idx)
{
for(%i = $TSObject::childCount[%idx] - 1; %i >= 0; %i --)
TSObject::delete($TSObject::child[%idx, %i]);
deleteVariables("$TSObject::attr" @ %idx @ "*");
deleteVariables("$TSObject::child" @ %idx @ "*");
deleteVariables("$TSObject::parent" @ %idx);
deleteVariables("$TSObject::exists" @ %idx);
}
function TSObject::exists(%idx)
{
return !!$TSObject::exists[%idx];
}
function TSObject::getAttribute(%idx, %attribute)
{
return $TSObject::attr[%idx, %attribute];
}
function TSObject::setAttribute(%idx, %attribute, %value)
{
return $TSObject::attr[%idx, %attribute] = %value;
}
function TSObject::addChild(%idx, %childIdx)
{
$TSObject::child[%idx, $TSObject::childCount[%idx]] = %childIdx;
$TSObject::childCount[%idx] ++;
TSObject::setParent(%childIdx, %idx);
}
function TSObject::removeChild(%idx, %childIdx)
{
%index = TSObject::getInternalChildIdx(%idx, %childIdx);
if(%index == -1)
return;
for(%i = %index + 1; %i < $TSObject::childCount[%idx]; %i ++)
$TSObject::child[%idx, %i - 1] = $TSObject::child[%idx, %i];
$TSObject::child[%idx, $TSObject::childCount[%idx]] = 0;
$TSObject::childCount[%idx] --;
TSObject::setParent(%childIdx, 0);
}
function TSObject::getInternalChildIdx(%idx, %childIdx)
{
for(%i = 0; %i < $TSObject::childCount[%idx]; %i ++)
{
if($TSObject::child[%idx, %i] == %childIdx)
return %i;
}
return -1;
}
function TSObject::setParent(%this, %idx, %parentIdx)
{
$TSObject::parent[%idx] = %parentIdx;
}