NAME
        #include <functionlist.h>
        #include <lpctypes.h>

        mixed * variable_list(object ob|lwobject, int flags)

DESCRIPTION
        Return an array with information about <ob>s variables. For
        every variable, 1 to 3 values (depending on <flags>) are
        stored in the result array conveying in this order:
          - the name of the variable
          - the variable flags (see below)
          - the return type (listed in <lpctypes.h>)
          - the value of the variable

        <ob> may be given as true object or as a filename. In the latter
        case, the efun does not try to load the object before proceeding.

        If <ob> is not the current object and the value of the variable is
        requested, a privilege_violation ("variable_list", <ob>) occurs.

        <flags> determines both which information is returned for every
        variable, and which variables should be considered at all.
        Its value is created by bin-or'ing together following flags from
        <functionlist.h>:

          Control of returned information:
            RETURN_FUNCTION_NAME    include the variable name
            RETURN_FUNCTION_FLAGS   include the variable flags
            RETURN_FUNCTION_TYPE    include the variable type as an integer
            RETURN_FUNCTION_LPCTYPE include the variable type as an lpctype
            RETURN_VARIABLE_VALUE   include the variable value

          Control of listed variables:
            NAME_INHERITED      don't list if defined by inheritance
            TYPE_MOD_STATIC ==
            TYPE_MOD_NOSAVE     don't list if nosave ('static') variable
            TYPE_MOD_PRIVATE    don't list if private
            TYPE_MOD_PROTECTED  don't list if protected
            NAME_HIDDEN         don't list if not visible through inheritance

        The 'flags' information consists of the bin-or of the list control
        flags given above, plus the following:

            TYPE_MOD_VIRTUAL    variable is inherited virtually
            TYPE_MOD_NO_MASK    variable is nomask
            TYPE_MOD_PUBLIC     variable is public

        All these flags are defined in <functionlist.h>, the 
        return types are defined in <lpctypes.h>.

HISTORY
        Introduced in LDMud 3.2.10.
        LDMud 3.6.7 introduced RETURN_FUNCTION_LPCTYPE.

SEE ALSO
        inherit_list(E), functionlist(E), variable_exists(E)
