GESCHUETZT
SYNOPSIS
        #include <functionlist.h>
        #include <lpctypes.h>

        mixed *variable_list(object|lwobject obj,
                             int flags = RETURN_FUNCTION_NAME)

BESCHREIBUNG
        Liefert ein Array mit Informationen ueber die Variablen von <obj>.
        Fuer jede Variable werden 1 bis 4 Werte in diesem Array gespeichert,
        abhaengig von <flags>. Die Resultate werden in dieser Reihenfolge
        im Array abgespeichert:
          - der Name der Variablen
          - die Flags der Variablen (siehe weiter unten)
          - der Rueckgabetyp (gemaess <lpctypes.h>)
          - der Wert der Variablen

        <obj> kann als Objekt oder als Dateinamen uebergeben werden. Im
        zweiten Fall versucht variable_list() nicht, das Objekt vor der
        Verarbeitung zu laden.

        Wenn <obj> nicht das aufrufende Objekt ist und der Wert der Variablen
        abgefragt wird, erzeugt dies eine Schutzverletzung ("variable_list",
        <obj>).

        Mit <flags> wird festgelegt, welche Informationen ueber welche
        Variablen abgefragt werden. Folgende Flags aus <functionlist.h>
        koennen mit binaerem Oder kombiniert werden:

        Auswahl der gesammelten Information:
            RETURN_FUNCTION_NAME    liefert den Namen der Variablen
            RETURN_FUNCTION_FLAGS   liefert die Flags der Variablen (s. unten)
            RETURN_FUNCTION_TYPE    liefert den Rueckgabetyp
            RETURN_VARIABLE_VALUE   liefert den Wert der Variablen

        Auswahl der Variablen, die ausgewertet werden:
            NAME_INHERITED        schliesst geerbte Variablen aus
            TYPE_MOD_STATIC       schliesst "static" deklarierte Variablen aus
            TYPE_MOD_NOSAVE       schliesst "nosave" deklarierte Variablen aus
            TYPE_MOD_PRIVATE      schliesst "private" deklarierte Variablen aus
            TYPE_MOD_PROTECTED    schliesst "protected" deklarierte Variablen
                                  aus
            NAME_HIDDEN           enthaelt Variablen, die geerbt wurden.

        Die Flags der Variablen koennen die Auswahl-Flags enthalten und
        zusaeztlich folgende Werte:
            TYPE_MOD_VIRTUAL      die Variable wurde virtuell geerbt
            TYPE_MOD_NO_MASGK     die Variable ist "nomask" deklariert
            TYPE_MOD_PUBLIC       die Variable ist "public" deklariert

        All diese Flags sind in <functionlist.h>, die Rueckgabewerte in
        <lpctypes.h> definiert.

GESCHICHTE
        Eingefuehrt in LDMud 3.2.10.

SIEHE AUCH
        inherit_list(E), functionlist(E), variable_exists(E)
