parent $command_cache object $commands var $root dbref 'commands var $root child_index 0 var $root fertile 0 var $root manager $commands var $root owned [$commands] var $root owners [$] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $root inited 1 var $commands commands #[["@cmd", [["@cmd", "* on *", "@cmd <this> on <any>", 'foo, 'local, #[[1, ["this", []]], [2, ["any", []]]]]]]] var $commands shortcuts #[] method add_command arg template, method, type; var cmd, tmp, x, loc, types; (> .perms(sender()) <); // ----- parse it first tmp = template.explode_delimited("<", ">"); loc = []; cmd = tmp[1]; types = tmp[2]; // Clean up cmd and set locations correctly for x in [1 .. listlen(cmd)] { if (type(cmd[x]) == 'string) { cmd = replace(cmd, x, (cmd[x]).trim()); } else { loc = [@loc, cmd[x]]; cmd = replace(cmd, x, "*"); } } cmd = [cmd[1], (cmd.sublist(2)).to_string()]; // parse command argument types for x in [1 .. listlen(types)] types = replace(types, x, (> $command.get_argument_type(types[x]) <)); // generate the types correctly tmp = #[]; for x in [1 .. listlen(loc)] tmp = tmp.add(loc[x], types[x]); types = tmp; // validate type if (!(type in ['local, 'remote])) throw(~type, "Command types can be either 'local or 'remote"); // add it ._add_command(@cmd, template, method, type, types); . method _add_command arg cmd, cmd_args, tmpl, method, type, types; (> .perms(sender(), 'this) <); commands = commands.add_elem(cmd, [cmd, cmd_args, tmpl, method, type, types]); . method _del_command arg cmd, cmd_args, [args]; var cinfo, c; (> .perms(sender(), 'this) <); cinfo = (| commands[cmd] |) || throw(~command, (("Command " + cmd) + " is not defined on ") + (.dbref())); for c in (cinfo) { if ((c[2]) == cmd_args) cinfo = cinfo.del(c); } if (!cinfo) commands = commands.del(cmd); else commands = commands.add(cmd, cinfo); .