#include "boot.clh"
object LOCATED_OBJ
parents ROOT_OBJ;
name = "Generic Located Object";
obj location;
list contents;
method init
if (this == LOCATED_OBJ)
this.add_owner(WIZARD);
else
location = #-1;
contents = {};
pass();
endif
endmethod /* init */
method destroy
var thing, thome;
ignore E_SERVERDN, E_OBJNF, E_METHODNF;
if (PERMS_OK)
if (location)
location.remove(this);
endif
for thing in (contents)
thome = thing.home;
if (thome)
thing.moveto(thome);
else
thing.moveto(NOTHING);
endif
endfor
pass();
else
raise(E_PERM);
endif
endmethod /* destroy */
blocked method location
return location;
endmethod /* location */
method contained_by
if (location == args[1])
return 1;
elseif (!location)
return 0;
else
return location.contained_by(args[1]);
endif
endmethod /* contained_by */
method contents
return contents;
endmethod /* contents */
method match_contents
var thing;
for thing in (contents)
if (thing.match(args[1]))
return thing;
endif
endfor
return NOTHING;
endmethod /* match_contents */
method moveto
var dest;
ignore E_SERVERDN, E_OBJNF, E_METHODNF;
/* two sensitive spots, both handled */
dest = args[1]; /* 1st arg is destination */
if (dest == location) /* we're already there! */
return 1; /* (that was easy) */
elseif (dest == this) /* can't put something inside itself */
return 0;
elseif (dest.contained_by(this)) /* or inside its location, etc */
return 0;
endif
lock ("moveto");
/*
* If there's a destination, and it doesn't accept this, return 0
* (note that E_SERVERDN here evaluates to FALSE)
*/
if (dest && !dest.accept(this))
return 0;
endif
/*
* Remove this from old location, if any.
* E_SERVERDN here is ignored (will be handled by remote server in
* SYS_OBJ.boot_server()
*/
if (location)
location.remove(this);
endif
/*
* Update location.
*/
location = dest;
return 1;
endmethod /* moveto */
/*
* accept - add object to contents list
*/
method accept
var what; /* what object to add */
what = args[1];
contents = contents + what;
if (serverof(what)) /* if object is visitor, */
SYS_OBJ.add_visitor(what, this); /* add it to visitorlist */
endif
return 1;
endmethod /* accept */
/*
* remove - remove object from contents list
*/
method remove
var what;
what = args[1];
contents = contents - what;
if (serverof(what)) /* if object is visitor, */
SYS_OBJ.rm_visitor(what, this); /* remove it from visitorlist */
endif
endmethod /* remove */
endobject /* LOCATED_OBJ */