skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/**
 * This is a inheritable that provides an efficient way of storing
 * lots of items. Only one copy of the item is effectively in storage
 * and everytime one is removed, an exact copy is duplicated and
 * put back in the store. Objects are added to the store via
 * add_object(). The actual storage container object
 * can be returned by query_cont() and this container should be
 * searched when you want to find what objects the store contains.
 * Any object can inherit this, and methods
 * should be put in place in the inheriting file that end up calling
 * create_real_object() which will sort out duplicating the item
 * and returning an object pointer to the one you can deal with.
 * @example
 * inherit "clone_on_demand";
 * int do_buy( objects *obs );
 *
 * void setup(){
 *   set_name("shop");
 *   set_short("widget shop");
 *   add_object( "sprocket" );
 * }
 *
 * object create_object( string arg ){
 *   if( arg == "sprocket" )
 *     return clone_object("/path/of/sprocket");
 * }
 *
 * void init(){
 *   add_command("buy", "<indirect:object:" +
 *                      base_name( query_cont() ) + ">");
 * }
 *
 * int do_buy( object *obs ){
 *   object ob;
 *   foreach(ob in obs){
 *     widget = create_real_object(ob);
 *     widget->move( this_player() );
 *   }
 *   add_succeeded_mess( "$N buy$s $I.\n", obs );
 *   return 1;
 * }
 *
 * @author Pinkfish Aquilo
 * @see add_object
 * @changed Changed to use a permanent temporary container so that we
 * wouldn't have to clone/dest a temporary container each time a real
 * object is created.  We also don't have to move each object twice in
 * create_real_object() anymore.
 * - Sandoz.
 */

#include <armoury.h>

#define INFINITE_LEFT 10000
#define MAX_PROP "max per reset"
#define NUM_REMOVED "number removed this reset"
#define REFERENCE "name we are reference by"
#define DISPLAY "display in shop"

nosave object _cont, _tmp_cont;

/**
 * This method returns the container which is used to keep one copy of
 * each items in storage.
 * @return the object container
 */
object query_cont() { return _cont; }

private object make_shop_container() {
    object ob;

    ob = clone_object("/std/container");
    ob->set_name("clone_on_demand-store");
    ob->add_property("parent", file_name(TO) );

    return ob;

} /* make_shop_container() */

/** @ignore yes */
void reset() {
    object ob;

    if( !_cont )
        _cont = make_shop_container();

    foreach( ob in INV(_cont) )
        ob->remove_property( NUM_REMOVED );

} /* reset() */

/**
 * This method is used to add an item to the storage.
 * When this method is called, create_object() is called
 * (with the object name as an arg) in the inheriting file.
 * If no object is returned by that function,
 * the name is cloned with clone_object(), and failing that
 * request_item() is called in the armoury against the name.
 *
 * This method makes add_weapon() and add_armour() obsolete.
 *
 * @example
 * add_object( "frog", 1 + random( 3 ) );
 * // This will try and create an object called frog, in the order mentioned
 * // above
 * @example
 * add_object( "/obj/food/apple.food", 0 );
 * // Add unlimited numbers of apples.
 * @param name the name of the object to add.
 * @param max_per_reset the maximum number of items to be available at any one time
 * @param display_as the name that this item is displayed as in shops
 * @return 1 if the item was added successfully to the store, 0 if it was not.
 */
varargs int add_object( string name, int max_per_reset, string display_as ) {
    object ob;

    if( !_cont )
         _cont = make_shop_container();

    if( !( ob = TO->create_object(name) ) &&
        !( ob = ARMOURY_H->request_item( name, 100 ) ) )
        ob = clone_object(name);

    if( ob ) {
        if( ob->query_decays() ) {
            // Stop decaying objects decaying in inventories.
            ob->set_decay_speed(0);
        }

        ob->move(_cont);

        if( display_as )
            ob->add_property( DISPLAY, display_as );

        ob->add_property( REFERENCE, name );
        ob->add_property( MAX_PROP, max_per_reset );
        return 1;
    }

    return 0;

} /* add_object() */

/**
 * Returns how more times object ob can be duplicated
 * @param ob the object to test
 * @return how many more times
 */
int query_num_items_left( object ob ) {
    int max, num;

    max = ob->query_property( MAX_PROP );
    num = ob->query_property( NUM_REMOVED );

    if( max )
        return max - num;

    if( max == -1 )
        return INFINITE_LEFT;

    return 0;

} /* query_num_items_left() */

/**
 * This function returns the quantity of particular object available
 * to be cloned on demand. In matching which object is the one in
 * question it uses the short name of the object, which is passed as
 * an argument to the function.
 * @param name is the short name of the object you wish to query.
 * @return the number left, returns INFINITE_LEFT if the shop has an infinite
 * number, returns -1 if the item isn't stocked.
 */
int query_number_left( string name ) {
    object  thing;

    thing = filter( INV(_cont), (: $1->query_short() == $(name) :) )[0];

    if( !thing )
        return -1; // We don't have that item.

    return query_num_items_left( thing );

} /* query_number_left() */

/**
 * This function can be used to check the quantity left of an array
 * of items.  It returns a parallel array of integers.  In other words
 * the array it returns contains the numbers of stock in array positions
 * corresponding to the array positions of the objects it was passed.
 * @example
 * query_items_left( ({ "banana" , "melon" }) )
 * would return ({ 12 , 6 }) if there were 12 bananas and 6 melons left.
 * @param names an array of the short names of the items you wish to query
 * @return an array of integers, each one returning like query_number_left
 * would for the object in that position of the object array.
 * @see query_number_left
 */
int *query_items_left( string *names ) {
    int sz, *numbers;

    // Empty arrays not allowed.
    if( ( sz = sizeof( names ) ) < 1 )
        return  ({ });

    numbers = allocate( sz );

    while( sz-- )
        numbers[sz] = query_number_left( names[sz] );

    return numbers;

} /* query_items_left() */

/**
 * This function transfers certain tracking properties from the
 * original item to the new item which replaces it in storage. To
 * transfer any additional properties, have switch_extra_properties()
 * defined in your inheriting object and return an array of extra
 * properties to transfer
 */
private void switch_properties( object newone, object original ) {
    mixed extra, *props, prop;

    props = ({ MAX_PROP, NUM_REMOVED, REFERENCE });

    if( sizeof( extra = TO->switch_extra_properties() ) )
        props += extra;

    foreach( prop in props ){
        newone->add_property( prop, original->query_property( prop ) );
        original->remove_property( prop );
    }

    if( newone->query_decay_speed() ) {
        original->set_decay_speed( newone->query_decay_speed() );
        // Stop decaying objects decaying in inventories.
        newone->set_decay_speed(0);
    }

} /* switch_properties() */

/**
 * The main point of entry. 'thing' should be an object already placed
 * in the clone_on_demand store container via 'add_object'. This
 * method then duplicates that object, replaces the original copy in
 * the container with this new one, and returns the original which can
 * be delt with as normal.
 * @param thing an object in the store
 * @return the original object
 * @see add_object
 */
protected object create_real_object( object thing ) {
    string name;
    object new_thing;

    name = thing->query_property( REFERENCE );

    if( !( new_thing = TO->create_object( name ) ) &&
        !( new_thing = ARMOURY_H->request_item( name, 80 + random( 20 ) ) ) )
        new_thing = clone_object(name);

    if( new_thing ) {
        int i, max, num;
        object tmp, *inv;

        switch_properties( new_thing, thing );

        // Restore contents' order.
        inv = INV(_cont);
        i = member_array( thing, inv );
        inv[i] = new_thing;
        i = sizeof(inv);

        thing->move("/room/void");

        if( !_tmp_cont )
            _tmp_cont = make_shop_container();

        while( i-- )
            inv[i]->move(_tmp_cont);

        // Switch containers.
        tmp = _cont;
        _cont = _tmp_cont;
        _tmp_cont = tmp;

        // Decrement store if applicable.
        num = new_thing->query_property( NUM_REMOVED );
        if( max = new_thing->query_property( MAX_PROP ) )
            new_thing->add_property( NUM_REMOVED, num + 1 );
    }

    return thing;

} /* create_real_object() */

/** @ignore yes */
void dest_me() {
    // Let's recycle too - Sandoz.
    if( _cont ) {
        INV(_cont)->move("/room/rubbish");
        _cont->dest_me();
    }

    // _tmp_cont should always be empty.
    if( _tmp_cont )
        _tmp_cont->dest_me();

} /* dest_me() */

/** @ignore yes */
mixed stats() {
    return ({
        ({"container", _cont }),
        ({"temporary container", _tmp_cont }),
    });
} /* stats() */