Query()
=======

FUNKTION
--------
::

     public mixed Query(string name, int Type = F_VALUE);

DEFINIERT IN
------------
::

     /std/thing/properties.c

ARGUMENTE
---------
::

     string name - Property, deren Wert(e) ausgelesen werden
     int type  - Art der gewuenschten Information.

BESCHREIBUNG
------------
::

     Der Wert einer der inneren Eigenschaften der Property 'name' wird
     zurueckgegeben.  'Type' ist dabei einer der in /sys/thing/properties.h
     und folgend aufgelisteten F_XXX-Werte:

     F_VALUE (==0, Default)
         Unter Umgehung einer eventuell vorhandenen Abfragemethode oder
         _query_'name'() wird der Datenwert der Property 'name'
         zurueckgegeben.
     F_MODE
          Die internen Flags der Property werden zurueckgegeben.Dies koennen
          (logisch mit & verknuepft) sein:
          SAVE  - Property soll bei save_object() gespeichert werden
          PROTECTED - Objekt selbst/EM/Root kann Property manipulieren
          SECURED  - wie PROTECTED, das Flag kann aber nicht
                     zurueckgesetzt werden (immer SECURED)
          NOSETMETHOD - niemand kann Property manipulieren
                        (auch kein F_SET_METHOD oder _set_'name'())
     F_SET_METHOD
          Ein eventuell fuer die Property eingetragene F_SET_METHOD wird
          zurueckgegeben.
          (_set_'name'()-Methoden werden so nicht aufgefuehrt!)
     F_QUERY_METHOD
          Ein eventuell fuer die Property eingetragene F_QUERY_METHOD wird
          zurueckgegeben.
          (_query_'name'()-Methoden werden so nicht aufgefuehrt!)

RUeCKGABEWERT
-------------
::

     Die gewuenschte Eigenschaft, abhaengig von 'Type'.

BEMERKUNGEN
-----------
::

     - Query() sollte nicht zum regulaeren Auslesen des Inhalt einer
       Property verwendet werden, da sowohl F_QUERY_METHOD als auch
       libinterne _query_'name'()-Methoden umgangen werden und das Ergebnis
       fuer so veraenderte Propertys undefiniert ist
     - _set_'name'() und _query_'name'() sind alte Propertymethoden und
       sollten nicht in normalen Objekten benutzt werden ->
       F_SET_METHOD/F_QUERY_METHOD (ggf. mit PROTECTED) nutzen
     - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
       sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
       diese geht nur 'static' (in diesem Fall empfohlen).

BEISPIELE
---------
::

     // Auslesen des Wertes unter Umgehung einer Abfragemethode
     Query(P_XYZ, F_VALUE);

     // Auslesen der Flags erfaehrt man mit:
     Query(P_XYZ, F_MODE);

     // sauberes Programmieren, wir wollen eine F_QUERY_METHOD setzen,
     // pruefen vorher auf Existenz:
     if(this_player()->Query(P_FROG, F_QUERY_METHOD) {
      write(break_string(
       "Ich kann dich nicht weiter vor Froschsein schuetzen!",
       "Der Magier winkt ab: ", 78));
      say(break_string(
       "Ich kann dich nicht weiter vor Froschsein schuetzen!",
       "Der Magier sagt zu "+this_player()->name(WEM)+": ", 78));
     } else {
      this_player()->Set(P_FROG, #'query_protect_frog, F_QUERY_METHOD);
      ...
     }

SIEHE AUCH
----------
::

     Aehnliches: SetProp(L), QueryProp(L), Set(L)
     Generell:  SetProperties(L), QueryProperties(L)
     Konzept:  properties, /std/thing/properties.c
     Sonstiges:  P_AUTOLOADOBJ

28.03.2008, Zesstra

