
Query()
*******


FUNKTION
========

   public varargs mixed Query(string name, int Type);


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
