SYNOPSIS
        object clone_object(string name, ...)
        object clone_object(object template, ...)

DESCRIPTION
        Clone a new object from definition <name>, or alternatively from
        the object <template>. In both cases, the new object is given
        an unique name and returned.

        The original used for cloning, called blueprint, should not be
        used in the system, just for cloning. The cloned objects
        contain only the data but the blueprint also the function code.
        The blueprint is the one without a unique number at the end of
        the object's name. The clone_object() function never
        returns a blue print.

        If the <name> or <template> designates a cloned object itself,
        the system looks up the blueprint object _by name_.

        Any further arguments will be passed to the H_CREATE_CLONE
        hook to initialize the cloned object.

        If the blueprint exists and has a heart_beat(), clone_object()
        turns it off.

        Note that the pathname must be complete, which means there are no
        relative paths allowed.

        If strict euids are enforced, the cloning object must have
        a non-zero euid.


        -- Variable Initialization --

        In general, variables are initialized for blueprints and clones alike
        with a call to the internal lfun __INIT().
        
        However, if #pragma share_variables is in effect (either explicitely
        given in the source or implicitly as runtime option), the values for
        a clone's uninitialized variables are taken from the _current_
        variables of the object's blueprint.

        In the absence of share_variables, variables without explicit
        initializers are initialized to 0.


EXAMPLES
        // Clone a torch (filename in non-compat format)
        object torch;
        torch = clone_object("/obj/torch");

        // Clone two keys (filename in compat format)
        object key1, key2;
        key1 = clone_object(load_object("obj/key"));
        key2 = clone_object(key1);

        // Create a specialized weapons blueprint.
        --- std/weapon.c: --- 
        #pragma share_variables
        int weapon_class = 1;

        --- broadsword.c: ---
        inherit "/std/weapon";

        int create() {
            weapon_class = 2;
            replace_program("/std/weapon");
        }


HISTORY
        Modified in LDMud 3.2.6 to take an object as argument.
        LDMud 3.3.378 consolidated the variable initialization with the
        share_variables pragma.

SEE ALSO
        blueprint(E), clonep(E), destruct(E), clones(E), load_name(E),
        load_object(E), move_object(E), uids(C), program_name(E), pragma(LPC)
