SYNOPSIS
        void set_this_object(object|lwobject object_to_pretend_to_be)

DESCRIPTION
        This is a privileged function, only to be used in the master
        object or in the simul_efun object.

        It changes the result of this_object() in the using function,
        and the result of previous_object() in functions called in
        other objects by call_other()/apply()/funcall(). Its effect will
        remain till there is a return of an external function call, or
        another call of set_this_object(). While executing code in the
        master object's program or the primary simul_efun object's
        program, set_this_object() is granted even if this_object() is
        altered by set_this_object(). This does not apply to functions
        inherited from other programs.

        Use it with extreme care to avoid inconsistencies.  After a
        call of set_this_object(), some LPC-constructs might behave in
        an odd manner, or even crash the system. In particular, using
        global variables or calling local functions (except by
        call_other) is illegal and actively prevented.

        Allowed are call_other(), map functions, access of local variables
        (which might hold array pointers to a global array), simple arithmetic
        and the assignment operators.

BUGS
        It is currently not possible to directly restore the original
        current object. So instead of writing

          object me = this_object();
          set_this_object(that);
          <some code>
          set_this_object(me);
          <more code>

        one has to use a workaround:

          private void doit (object that) {
            set_this_object(that);
            <some code>
          }

          funcall(#'doit, that);
          <more code>

        Some people would consider this a feature.

HISTORY
        LDMud 3.2.10 actively prevents references to global variables
        and function calls by address while set_this_object() is in
        effect.

SEE ALSO
        this_object(E), set_this_player(E)
