parent $has_verbs parent $named object $described var $described prose #[] var $root child_index 0 var $root owners [$described] var $root fertile 0 var $has_verbs verbs #[["l?ook at %this", ['look_vrb, 'noremote]], ["l?ook %this", ['look_vrb, 'noremote]], ["exam?ine %this", ['examine_vrb, 'remote]]] var $root inited 1 var $root owned [$described] var $root manager $described var $root writable [$described] var $root readable ['parameters, 'methods, 'code] var $root dbref 'described var $named name ['uniq, "Generic Described Object"] var $named name_aliases [] method init_described .perms($root, caller()); prose = #[]; . method description arg actor, [exclude]; var out; // similar to MOO's :look_self() // meant to be changed by descendants, if they so desire to. return [.name('def), @.prose('short)]; . method look_vrb arg vrb, [args]; var actor; sender().tell(.short_description(sender(), sender())); . method prose arg type, [args]; var type, def; def = [@args, ["You see nothing special"]][1]; switch (type) { case 'literal: return prose; default: return (| prose[type] |) || ((| prose['short] |) || def); } . method descriptionf arg actor, exclude, [args]; var out, part, type; // lists should be ['methodname, args for method] // symbols are shortcuts, to be defined on descendants. out = []; for part in (args) { type = type(part); switch (type) { case 'list: out = out + ((| .(part[1])(@sublist(part, 2)) |) || []); case 'symbol: // ignore them, they should have been dealt with by now. } } return out; . method set_prose arg ptype, new_prose; // ptype should be either 'short or 'long // prose should be a list of strings .perms(sender(), 'manager); if (type(ptype) != 'symbol) throw(~type, "Prose type can be either 'short or 'long."); if (type(new_prose) != 'list) throw(~type, "Prose must be given as a list of strings."); if ((!new_prose) || (!(new_prose[1]))) prose = dict_del(prose, ptype); else prose = dict_add(prose, ptype, new_prose); . method examine_vrb arg vrb, [args]; var actor; sender().tell(.long_description(sender(), sender())); . method long_description arg actor, [exclude]; var out; // intended to be redefined by children. return [.name('def), @.prose('long)]; . method short_description arg actor, [exclude]; var out; // intended to be redefined by children. return [.name('def), @.prose('short)]; .