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
