Located object This object defines behavior having to do with having a location. Public methods (non-overridable): location() Get location Methods for which I haven't decided on authentication yet: move(place) Move to new place Overridable notification calls from $located: will_move(obj, place) Notification of impending move did_move(obj, old_place) Notification of move Protected methods: verbs_changed_on_leaf() Notification that verbs changed parent vr object located var located inited 0 var located location 0 method init arg ancestors; (> pass(ancestors) <); if (definer() in ancestors) { location = $sys.starting_room(); location.add_sender_to_contents(); } . method uninit arg ancestors; var old; if (!caller().is_agent('hierarchy)) throw(~perm, "Caller is not an agent of hierarchy protocol."); catch any { if (definer() in ancestors) { old = location; location = 0; old.remove_sender_from_contents(); } } pass(ancestors); . eval .initialize(); .set_name("Generic located object"); . method location disallow_overrides; return location; . method move disallow_overrides; arg place; var old; // Don't do anything if we're already here. if (place == location) return; if (!place.follows('container)) throw(~type, "Argument doesn't follow container protocol."); // Notify involved parties of impending move, allowing them to throw // errors. (> .will_move(sender(), place) <); (> location.will_leave(place) <); (> place.will_arrive(location) <); // Set location. old = location; location = place; old.remove_sender_from_contents(); place.add_sender_to_contents(); // Notify involved parties of completed move, in reverse order. place.did_arrive(old); old.did_leave(place); .did_move(sender(), old); . method will_move arg mover, place; if (caller() != definer() || sender() != this()) throw(~perm, "Invalid call to private method."); . method did_move arg mover, old_place; if (caller() != definer() || sender() != this()) throw(~perm, "Invalid call to private method."); . method verbs_changed_on_leaf // This is a leaf object (it has no descendents) and the verbs on it // changed. We must invalidate the cache on all objects for which this // object is visible. We'll let the location handle that. (> pass() <); if (location.follows('room)) location.verb_changed_inside(); .