Support fuer Mapper-Setmethoden

Setmethoden koennen zusammen mit einem neuen Modus SETMAPPED
eingetragen werden. In diesem Fall speichert die Setmethode
den Wert nicht selber, sondern gibt ihn nur zurueck und die
Propertyverwaltung speichert den neuen Wert.

Das ermoeglicht (wiederverwendbare, generische) Funktionen
als Mapper.

Change-Id: Ief259dc4ccad9bc0e9138ab964edeb6a2b408949
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 2864a2c..d289de1 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -108,7 +108,16 @@
     case F_MODE:     prop[F_MODE][name]^= Value;
                      if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
                      return prop[F_MODE][name];
+
+    // Query- und Setmethoden laufen ab hier durch.
     case F_SET_METHOD:
+    case F_SET_MAPPER:
+      // SETMAPPED passend setzen
+      if (Type==F_SET_METHOD)
+        prop[F_MODE][name] &= ~SETMAPPED;
+      else
+        prop[F_MODE][name] |= SETMAPPED;
+      // Ab hier alles gleich
       // -1 als Setz-Methode: Nosetmethod setzen
       if (Value == -1)
       {
@@ -116,7 +125,7 @@
         prop[F_MODE][name] |= NOSETMETHOD;
         return 0;
       }
-      // Kein break!
+      // Kein break! Rest wie Querymethod
     case F_QUERY_METHOD:
       // Ungebundene Lambda_Closure? Heutzutage ein Fehler.
       if (closurep(Value) && !query_closure_object(Value))
@@ -148,8 +157,9 @@
 {
   mixed result;
 
+  int mode = prop[F_MODE][name];
   // NOSETMETHOD: Darf nicht gesetzt werden
-  if (prop[F_MODE][name] & NOSETMETHOD ) return -1;
+  if (mode & NOSETMETHOD ) return -1;
 
   // Set-Method abfragen, so vorhanden
   // TODO: nachdem alle moeglichen Werte als Set-Methode illegal sind, auf
@@ -174,6 +184,11 @@
     {
       prop[F_SET_METHOD]-=([name]);
     }
+    else // Erfolgreicher call
+    {
+      if (mode & SETMAPPED) // SM hat noch nicht selber gesetzt
+        result = Set( name, result, F_VALUE, extern||extern_call() );
+    }
 
     // Wenn dieser Aufruf closure_call gesetzt hat, wieder loeschen.
     // Da 0 ein gueltiger Wert ist, wird um eins dekrementiert, damit das Flag
@@ -181,7 +196,7 @@
     if (set_closure_call) --closure_call;
 
     // Und zurueckgeben
-    return result; 
+    return result;
   }
 
   // _set_*-Methode vorhanden? falls ja, aufrufen.