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 container inited 0
var container contents 0

method init
    arg ancestors;

    (> pass(ancestors) <);
    if (definer() in ancestors)
	contents = []; 
.

eval
    .init(ancestors());
    .set_name("Generic container object");
.

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().is_agent('movement))
	throw(~perm, "Caller not an agent of located protocol");
.

method will_leave
    arg place;

    if (!caller().is_agent('movement))
	throw(~perm, "Caller not an agent of located protocol");
.

method did_arrive
    arg place;

    if (!caller().is_agent('movement))
	throw(~perm, "Caller not an agent of located protocol");
.

method did_leave
    arg place;

    if (!caller().is_agent('movement))
	throw(~perm, "Caller not an agent of located protocol");
.

method add_sender_to_contents
    disallow_overrides;

    if (!caller().is_agent('movement))
	throw(~perm, "Caller not an agent of located protocol");
    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 not an agent of located protocol");
    if (sender().location() == this())
	throw(~location, "You're still here.");
    contents = setremove(contents, sender());
.