SYNOPSIS
        object|lwobject previous_object()
        object|lwobject previous_object(int i)

DESCRIPTION
        Returns an object pointer to the object that did a call (call_other(),
        funcall(), etc) to the current object, if any. If that object is
        destructed, the function returns 0.

        If the optional arg is given, the call_other()s are followed
        back i times (i.e. previous_object(1) returns the caller of
        the caller): 0 <= i < caller_stack_depth(). If <i> is less than 0, the
        first previous object is returned.

        There is an important special case: in functions called by
        the gamedriver in reaction to some external event (e.g. commands
        added by add_action), previous_object() will return this_object(),
        but previous_object(0) will return 0.

EXAMPLES
        int security() {
           object|lwobject prev;
           if (!(prev=previous_object()));
           else if (getuid(prev)  != getuid(this_object()));
           else if (geteuid(prev) != geteuid(this_object()));
           else return 1;
           return 0;
        }
        void highly_sensible_func() {
            if (!security())
                return;
            ...
        }

        This example shows how we can check if the last call to a
        function of the current object is secure or if we should abort
        execution.

BUGS
        Values of i < 0 are treated as if i == 0 was passed - this is
        historic.

SEE ALSO
        call_other(E), this_object(E), this_player(E),
        caller_stack(E), caller_stack_depth(E), extern_call(E)
