Set()
=====

FUNKTION
--------
::

     public varargs mixed Set(string name, mixed Value, int Type, int extern);

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

     /std/thing/properties.c
     /sys/thing/properties.h (Prototyp)

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

     name - Property, die manipuliert werden soll
     Value - der zu setzende/aendernde Wert
     Type - die Eigenschaft der Property, die manipuliert werden soll
     extern - Interne Verwendung:
    Wurde Set ueber SetProp von aussen gerufen.

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

     Eine der inneren Eigenschaften der Property 'name' wird veraendert.
     'Type' ist dabei einer der in /sys/thing/properties.h definierten
     F_XXX - Werte:

     F_VALUE (==0, default)
       Setzt den Inhalt der Property auf 'Value'. Aehnlich "SetProp",
       umgeht jedoch eine etwaige F_SET_METHOD oder _set_'name'()-Methode.
     F_MODE
     F_MODE_AS
     F_MODE_AD
       Aendert eines der internen Flags der Property. F_MODE negiert den
       vorherigen Wert vom Flag 'Value', F_MODE_AS setzt und F_MODE_AD
       loescht ihn.
       Verfuegbare interne Flags:

         SAVE 

           Property wird bei save_object() gespeichert

         PROTECTED 

           Flag setzbar durch:   beliebiges Objekt
           Flag loeschbar durch: this_object(), ROOT, EM+
           Inhalt der Property veraendern sowie Set- und Query-Methoden
           setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+
           WARNUNG: Dieses Flag nicht leichtfertig bei Spielern setzen!

         SECURED  

           Flag setzbar durch:   this_object(), ROOT, EM+
           Flag loeschbar durch: Niemanden!
           Inhalt der Property veraendern sowie Set- und Query-Methoden
           setzen oder loeschen duerfen nur noch this_object(), ROOT, EM+

         NOSETMETHOD 

           Property nicht mehr ueber SetProp() aenderbar
           (damit entfallen auch SET_METHOD, _set_'name')
     F_SET_METHOD
       Aendert den Eintrag fuer eine SetMethod - eine Closure, die anstatt
       des Setzens der Property beim Aufruf von SetProp mit 'Value'
       aufgerufen wird.
     F_QUERY_METHOD
       Aendert den Eintrag fuer eine QueryMethod - eine Closure, die anstatt
       des Lesens der Property beim Aufruf von QueryProp aufgerufen wird.

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

     Das Ergebnis der Manipulation bzw. einer der definierten
     Fehlercodes.

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

     - Set() sollte nicht zum regulaeren Manipulieren des Inhalts einer
       Property verwendet werden, da sowohl F_SET_METHOD als auch libinterne
       _set_'name'()-Methoden umgangen werden und das Ergebnis fuer so
       veraenderte Properties undefiniert ist.
     - eine gesetzte F_SET/F_QUERY_METHOD hat bei SetProp/QueryProp Vorrang
       vor einer _set/_query_method
       -> _set/_query wird nach erfolgreichem Ruf von F_XXX_METHOD ignoriert
     - F_SET/F_QUERY_METHOD sollte normalerweise Vorzug vor einer
       _set_/_query_* gegeben werden.

    SetMethods/QueryMethods:
     - falls ihr Query/SetMethods an oeffentlichen Properties setzen
       wollt, prueft bitte vorher, ob dort nicht schon eine (fremde) gesetzt
       ist und brecht ggf. euer Set() ab, um nicht die Arbeit anderer
       Mitmagier zu sabotieren (z.B. P_HANDS)
     - Properties sollten mit Query- oder SetMethoden nur so lange wie
       noetig belegt werden
       -> manche Properties sollte man als Wert setzen, _auch wenn_ die
          Spieler sie zuruecksetzen koennten (zB P_MSGIN/P_MSGOUT)
     - auf keinen Fall den Wert speichern, ueberschreiben, rueckschreiben,
       das fuehrt fast immer zu Problemen.
     - Set/QueryMethoden sollten nicht als Trigger/Listener fuer ein
       Ereignis (z.B. P_DIE_MSG fuer das Ereignis "Tod des Spielers")
       missbraucht werden
       -> es gibt sichere und saubere Moeglichkeiten (NotifyPlayerDeath),
          und wenn nicht, wendet euch an den EM eures Vertrauens
     - F_SET/F_QUERY_METHODs koennen 'protected' (empfohlen) oder 'static'
       sein. _set_/_query_ duerfen momentan _nicht_ 'protected' sein, fuer
       geht nur 'static' (in diesem Fall empfohlen).

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

     ### Aendern von Eigenschaften einer Property ###
     // Setzen des SAVE-Flags (bei save_object() mitzuspeichern)
     Set(P_XYZ, SAVE, F_MODE_AS);

     // Loeschen des SAVE-Flags
     Set(P_XYZ, SAVE, F_MODE_AD);

     

     // Negieren des bisherigen SAVE-Flags
     Set(P_XYZ, SAVE, F_MODE);
     // Hinweis: das Setzen des Flags funktioniert mittels F_MODE nur dann,
     // wenn sichergestellt ist, dass es vorher nicht gesetzt war. Die 
     // sichere Variante ist daher, F_MODE_AS zu verwenden.

     // Sperren des SetProp/SET_METHOD-Zugriffs:
     Set(P_XYZ, NOSETMETHOD, F_MODE_AS);

     // Vorlaeufiger Zugriffsschutz fuer eine Property:
     Set(P_XYZ, PROTECTED, F_MODE_AS);

     // Permanenter Zugriffsschutz fuer eine Property:
     Set(P_XYZ, SECURED, F_MODE_AS);

     ### Setzen einer SetMethod/QueryMethod ###
     // Setzen einer internen SetMethod
     mixed foo(mixed val);
     ...
     Set(P_XYZ, #'foo, F_SET_METHOD);
     ...

     // Setzen einer QueryMethod bei einem anderen Objekt
     mixed bar();
     ...
     other->Set(P_XYZ, #'bar, F_QUERY_METHOD);
     ...

     // Der Vollstaendigkeit halber sei das Aendern einer Property unter
     // Umgehung von Set-Methoden angegeben. Es ist aber aus o.g. Gruenden
     // zu empfehlen, diese Variante nicht zu verwenden.
     Set(P_XYZ, "bla", F_VALUE);

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

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

06. Jan 2008 Arathorn

