+ SGPropertyNode_ptr n = 0;
+ try {
+ n = (*node)->removeChild(naStr_data(child), (int)index.num, false);
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ }
+ return propNodeGhostCreate(c, n);
+}
+
+static naRef f_removeChildren(naContext c, naRef me, int argc, naRef* args)
+{
+ NODEARG();
+ naRef result = naNewVector(c);
+ if(naIsNil(argv) || naVec_size(argv) == 0) {
+ // Remove all children
+ for(int i = (*node)->nChildren() - 1; i >=0; i--)
+ naVec_append(result, propNodeGhostCreate(c, (*node)->removeChild(i)));
+ } else {
+ // Remove all children of a specified name
+ naRef name = naVec_get(argv, 0);
+ if(!naIsString(name)) return naNil();
+ try {
+ vector<SGPropertyNode_ptr> children
+ = (*node)->removeChildren(naStr_data(name), false);
+ for(unsigned int i=0; i<children.size(); i++)
+ naVec_append(result, propNodeGhostCreate(c, children[i]));
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
+ }
+ return result;
+}
+
+static naRef f_alias(naContext c, naRef me, int argc, naRef* args)
+{
+ NODEARG();
+ SGPropertyNode* al;
+ naRef prop = naVec_get(argv, 0);
+ try {
+ if(naIsString(prop)) al = globals->get_props()->getNode(naStr_data(prop), true);
+ else if(naIsGhost(prop)) al = *(SGPropertyNode_ptr*)naGhost_ptr(prop);
+ else throw string("props.alias() with bad argument");
+ } catch (const string& err) {
+ naRuntimeError(c, (char *)err.c_str());
+ return naNil();
+ }
+ return naNum((*node)->alias(al));
+}
+
+static naRef f_unalias(naContext c, naRef me, int argc, naRef* args)
+{
+ NODENOARG();
+ return naNum((*node)->unalias());