I've created a (slightly hacky) system to replace this, for now:
childLayer.cs (163 LOC)Full function list:
void SimObject::addChildLayer(scope)Adds a new namespace (x::) to the list of child layers on the object.
If the namespace is already a child layer, it is pushed to the top.
void SimObject::removeChildLayer(scope)Removes a namespace (x::) from the list of child layers on the object.
If the namespace is not a child layer, no errors occur.
bool SimObject::hasChildLayer(scope)Checks whether or not the object has the given scope as a child layer.
@any SimObject::callChildLayer(method[, *args:40])Calls the given method on every child layer consecutively from the top.
Returns the first return value that is not "".
@any SimObject::terminalCallChildLayer(method[, *args:40])Calls the given method on every child layer consecutively from the top.
Returns the first return value that is not "". The difference to ::callChildLayer,
is that this method stops when it reaches a layer that gives a return value that is not "".