/
CDC-1.2b/
CDC-1.2b/src/
parent $physical
object $exit

var $exit source $void
var $exit dest $void
var $exit lock <$true_lock_class, []>
var $root child_index 388
var $root owners [$exit]
var $root fertile 1
var $has_verbs verbs #[["@lock %this with *", ['lock_vrb, 'remote]]]
var $root inited 1
var $root owned [$exit]
var $gendered gender $gender_neuter
var $described prose #[]
var $root manager $exit
var $root writable [$exit]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'exit
var $named name ['uniq, "Generic Exit"]
var $named name_aliases []

method init_exit
    .perms($root, caller());
    source = $places.place('default);
    dest = source;
    source.add_exit(0, 0);
    lock = $true_lock_class.new();
.

method uninit_exit
    .perms(caller(), $root);
    (| source.del_exit() |);
    (| source.did_detach() |);
    (| dest.did_detach() |);
    source = 0;
    dest = 0;
    lock = 0;
.

method environment
    return [this()] + setremove(source.environment(), this());
.

method invoke
    var actor, here;
    
    if (!valid(.dest()))
        $parse.tell_error((((.name()) + " has an invalid destination, notify the manager (") + ((.manager()).namef('ref))) + ").", "", actor);
    if (lock.try(sender()))
        sender().move_to(.dest());
    else
        sender().tell((.name()) + " is locked.");
    
    // we could do this as an event, but in leiu of simplicity and speed
    // this is better.
    (.source()).exit_departure(sender());
    (.dest()).exit_arrival(sender());
    
    // Send an event for everybody else
    ($movement_event.new(sender(), .source(), .dest())).dispatch();
.

method lock_vrb
    arg cmd, this, prep, str;
    
    .perms(sender());
    catch ~objnf, ~parse {
        lock = $lock.parse(str, sender());
        sender().tell("Locked.");
    } with handler {
        switch (error()) {
            case ~objnf:
                sender().tell("Object not found in lock string.");
            case ~parse:
                sender().tell("Invalid lock string.");
        }
    }
.

method attach
    disallow_overrides;
    arg source_place, dest_place, radial, azimuth;
    
    // radial/azimuth coordinates.
    (> .perms(sender()) <);
    (> $places.is_place(source_place) <);
    (> $places.is_place(dest_place) <);
    if (source_place == source)
        return;
    (> source_place.will_attach('source, sender()) <);
    (> dest_place.will_attach('dest, sender()) <);
    (| source.del_exit() |);
    source = source_place;
    dest = dest_place;
    source_place.add_exit(radial, azimuth);
    (| source_place.did_attach('source, sender()) |);
    (| dest_place.did_attach('dest, sender()) |);
.

method dest
    return dest;
.

method source
    return source;
.

method place_destroyed
    arg place;
    
    .perms(caller(), $place);
    .destroy();
.

method description
    arg actor, [exclude];
    var out, prose;
    
    prose = .prose('long, "");
    if (!prose)
        return (| (.dest()).description(actor, @exclude) |) || (.prose('short));
    return [.name('def), @.prose('short)];
.

method short_description
    arg actor, [exclude];
    var prose;
    
    return .long_description(actor, @exclude);
.

method long_description
    arg actor, [exclude];
    var prose;
    
    prose = .prose('literal);
    if (!(| prose['long] |))
        return (| (.dest()).short_description(sender(), sender()) |) || (> pass(actor, @exclude) <);
    return (> pass(actor, @exclude) <);
.