Command-handling object This object defines command-handling behavior. Public methods: match_command(str) Match command against str commands() Get list of commands all_commands() Get commands on ancestors too Owner methods: add_command(template, type, method) Add a command remove_command(method) Remove a command parent root object commands var commands commands 0 method init arg ancestors; (> pass(ancestors) <); if (definer() in ancestors) commands = []; . eval .initialize(); .set_name("Generic command-handling object"); . method add_command arg template, type, method; if (!.is_owned_by(sender())) throw(~perm, "Sender is not an owner."); if (type(template) != 'string || type(method) != 'symbol) throw(~type, "Template and method are not a string and symbol."); if (type != 'template && type != 'pattern) throw(~type, "Type is neither 'template nor 'pattern."); commands = commands + [[template, type, method]]; . method del_command arg method; var command; if (!.is_owned_by(sender())) throw(~perm, "Sender is not an owner."); for command in (commands) { if (command[3] == method) { commands = setremove(commands, command); return; } } throw(~commandnf, "No command with method " + tostr(method)); . method match_command arg str; var cmd, fields; for cmd in (.all_commands()) { if (cmd[2] == 'template) fields = match_template(cmd[1], str); else fields = match_pattern(cmd[1], str); if (fields) return [cmd[3], fields]; } return 0; . method commands return commands; . method all_commands var p, cmdlist, pc; // Collect complete command list from ancestors. Ancestors may not be // command-handling objects, in which case (| p.commands() |) is // ~methodnf. cmdlist = []; for p in (ancestors()) { pc = (| p.commands() |); if (pc) cmdlist = cmdlist + pc; if (p == $commands) break; } return cmdlist; .