/
CDC-1.2b/
CDC-1.2b/src/
parent $physical
parent $has_commands
object $location

var $location contents []
var $root child_index 0
var $root owners [$location]
var $root fertile 1
var $has_verbs verbs #[]
var $root inited 1
var $located location $void
var $root owned [$location]
var $gendered gender $gender_neuter
var $described prose #[]
var $root manager $location
var $root writable [$location]
var $root readable ['parameters, 'methods, 'code]
var $has_commands commands []
var $has_commands shortcuts []
var $root dbref 'location
var $named name ['uniq, "Generic Container Object"]
var $named name_aliases []
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache []
var $old_command_environment shortcuts_cache []

method init_location
    .perms(caller(), $root);
    contents = [];
.

method uninit_location
    var obj;
    
    .perms(caller(), $root);
    for obj in (contents)
        obj.move_to($nowhere);
.

method contents
    return contents || [];
.

method contains
    arg obj;
    
    return (obj in (.contents())) ? 1 | 0;
.

method put
    arg obj;
    
    obj._move_to(this());
.

method take
    arg obj;
    
    if (!(obj in contents))
        throw(~objnf, ("Object (" + toliteral(obj)) + ") not in contents.");
    obj._move_to(sender());
.

method will_arrive
    arg old_place;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
.

method will_leave
    arg place;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
.

method did_arrive
    arg place;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
    (| .add_to_command_environment(sender()) |);
.

method did_leave
    arg place;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
    (| .del_from_command_environment(sender()) |);
.

method add_sender_to_contents
    disallow_overrides;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
    if ((sender().location()) != this())
        throw(~location, "Sorry, but you're not here.");
    contents = setadd(.contents(), sender());
.

method del_sender_from_contents
    disallow_overrides;
    
    if (caller() != $located)
        throw(~perm, "Caller not an agent of located protocol.");
    contents = setremove(contents, sender());
.

method validate_contents
    var obj, newcont;
    
    if (!(.is_writable_by(sender())))
        throw(~perm, "Must be an owner to validate contents");
    newcont = [];
    for obj in (contents) {
        if (valid(obj) && (obj.has_ancestor($located)))
            newcont = setadd(newcont, obj);
    }
    contents = newcont;
.

method environment
    return [this()] + contents;
.

method add_to_contents
    disallow_overrides;
    arg what;
    
    if (caller() != $located)
        throw(~perm, "Caller is not $located.");
.

method contents_accept_mail
    return 1;
.

method realm
    arg [args];
    var loc;
    
    loc = "";
    if ((| .location() |))
        loc = (.location()).realm();
    return ((loc + "[") + (.namef())) + "]";
.

method realm_name
    return "";
.

method local_verb_templates
    var obj, out;
    
    return dict_keys(.verb_cache());
    out = [];
    for obj in (.contents()) {
        if (obj.has_ancestor($has_verbs))
            out = out + dict_keys(obj.all_verbs());
    }
    return out;
.