Set()
=====

FUNKTION
--------
::

     public mixed Set(string name, mixed Value,
                 int Type = F_VALUE, int drop_priv = extern_call())

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
     drop_priv - Interne Verwendung, wenn Aufrufer Privilegien abgibt,
                 z.B. objekt-interner Aufruf extern zaehlen soll.

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

8.9.2021, Zesstra

