SYNOPSIS
        #include <functionlist.h>

        mixed function_exists(string str)
        mixed function_exists(string str, int flags)
        mixed function_exists(string str, object|lwobject ob)
        mixed function_exists(string str, object|lwobject ob, int flags)

DESCRIPTION
        Look up a function <str> in the current object, respectively
        in the object <ob>. Depending on the value of <flags>, one
        of the following informations is returned:

        <flags> == FEXISTS_PROGNAME (0, default):
          Return the name of the program the function is defined in.
          This can be either object_name(ob), or the name of an inherited
          program. If !compat mode, the returned name always begins
          with a '/'.

        <flags> == FEXISTS_FILENAME (1):
          Return the name of the file the function is defined in (this
          may be an include file). If !compat mode, the returned name
          always begins with a '/'.

        <flags> == FEXISTS_LINENO (2):
          Return the line number within the source file.

        <flags> == FEXISTS_ALL (3):
          Return an array with all the above information, plus information
          about the function type/flags/number of arguments.
          
          The returned array contains this information:
            string [FEXISTS_PROGNAME]: the program name
            string [FEXISTS_FILENAME]: the filename
            int    [FEXISTS_LINENO]:   the linenumber
            int    [FEXISTS_NUMARG]:   the number of arguments to the function
            int    [FEXISTS_TYPE]:     the return type of the function
            int    [FEXISTS_FLAGS]:    the function flags

        The <flags> value can be or-ed to NAME_HIDDEN to return
        information about static and protected functions in other objects.
        It is not possible to return information about private functions.

        If the function cannot be found (because it doesn't exist or
        it is not visible to the caller), the result is 0.


EXAMPLES
        function_exists("create")
        function_exists("create", that_object, NAME_HIDDEN|FEXISTS_ALL);

HISTORY
        LDMud 3.2.10 broadened the range of returned values and introduced
          the <flags> argument.
        LDMud 3.2.12/3.3.713 added the function type/flags/number of arguments
          to the result of FEXISTS_ALL.

SEE ALSO
        call_other(E), call_resolved(E), functionlist(E), variable_exists(E)
