Auto-Objekt-Modus fuer Dinge.

Gegenstaende bekommen einen sog. Auto-Objekt-Modus. Wird
dieser nach der Erzeugung eingeschaltet, entfaellt der
Check auf ein gueltiges Environment 10s nach der Erzeugung.
Allerdings wird ein Objekt sich dann im naechsten Reset
kommentarlos aufraeumen, falls es dann noch kein Environment
hat.

Change-Id: Ib010562036b6d9c1b18f0c42ed3af733b1f3ec99
diff --git a/std/thing/envchk.c b/std/thing/envchk.c
index f6ce13b..3c63dff 100644
--- a/std/thing/envchk.c
+++ b/std/thing/envchk.c
@@ -13,6 +13,7 @@
 #include <moving.h>
 #define NEED_PROTOTYPES
 #include <thing/moving.h>
+#include <thing/properties.h>
 
 protected void check_for_environment(string cloner)
 {
@@ -29,8 +30,47 @@
   }
 }
 
-void create()
+protected void create()
 {
-	if( clonep() ) 
+  if( clonep() )
     call_out(#'check_for_environment, 3, object_name(previous_object()));
 }
+
+// Kein Envcheck fuer Auto-Objekte, dafuer entfernen diese sich im naechsten
+// Reset, sofern sie noch kein Environment haben.
+// BTW: Abschalten des Resets sorgt fuer kein Aufraeumen.
+public int SetAutoObject(int autostate)
+{
+  if (autostate)
+  {
+    Set("p_lib_autoobject", 1, F_VALUE);
+    Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AS);
+    remove_call_out(#'check_for_environment);
+    if (autostate > 1)
+      set_next_reset(autostate);
+    // else: Standardresetzeit
+  }
+  else
+  {
+    // (Re-)Enable envchk
+    Set("p_lib_autoobject", 0, F_VALUE);
+    Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AD);
+    if (clonep() && find_call_out(#'check_for_environment) == -1)
+      call_out(#'check_for_environment, 3, object_name(previous_object()));
+  }
+  return autostate;
+}
+
+void reset()
+{
+  // wenn kein env und Autoobject: zerstoeren
+  if (clonep() && !environment()
+      && Query("p_lib_autoobject", F_VALUE))
+  {
+    remove(1);
+    // hier wirklich erzwingen, um unter allen Umstaenden zu vermeiden, dass
+    // sich dauerhaft Clones ansammeln, die niemand mehr referenziert.
+    if (objectp(this_object()))
+      destruct(this_object());
+  }
+}