Container object

    This object defines object behavior related to having contents.

    Public methods:

	contents()			Get contents
	contains(obj)			Determine if object in contents
	put(obj)			Put object in container
	take(obj)			Take object from container

    Non-overridable calls from $located:

	add_sender_to_contents()	Add sender to contents
	remove_sender_from_contents()	Remove sender from contents

    Overridable notification calls from $located:

	will_arrive(old_place)		Notification of impending arrival
	will_leave(place)		Notification of impending departure
	did_arrive(old_place)		Notification of completed arrival
	did_leave(place)		Notification of completed departure

parent vr
object container

var root name 'container
var container contents 0

method init_container
    if (caller() != $root)
        throw(~perm, "Caller is not $root.");
    contents = []; 
.

method uninit_container
    if (caller() != $root)
        throw(~perm, "Caller is not $root.");

    // Do something about contents.  This isn't it.
    contents = 0;
.

eval
    .initialize();
    .set_vr_name("Generic container object");
.

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

method contents
    return contents;
.

method contains
    arg obj;

    return obj in contents ? 1 | 0;
.

method put
    arg obj;

    obj.move(this());
.

method take
    arg obj;

    if (!(obj in contents))
	throw(~objnf, "Object (" + toliteral(obj) + ") not in contents.");
    obj.move(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.");
.

method did_leave
    arg place;

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

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 remove_sender_from_contents
    disallow_overrides;

    if (caller() != $located)
	throw(~perm, "Caller is not $located,");
    contents = setremove(contents, sender());
.