GetHelperObject nun aehnlich filter()

GetHelperObject() wurde umgebaut, um eine aehnliche
Signatur und ein aehnliches Verhalten wie ein
filter() ueber die jeweilige P_*_HELPER Property zu
haben.

Change-Id: I43da08835fcfba0a20716d027ee8bd123d682a02
diff --git a/std/living/helpers.c b/std/living/helpers.c
index 26c94e5..e029827 100644
--- a/std/living/helpers.c
+++ b/std/living/helpers.c
@@ -147,23 +147,36 @@
   return deep_copy(Query(P_HELPER_OBJECTS,F_VALUE));
 }
 
-public varargs object GetHelperObject(int type, int|closure strength)
+public varargs object GetHelperObject(int type, int|closure strength,
+                                      varargs mixed* extra)
 {
   object ob;
-  // Wir brauchen strength als kleineren Wert, als den minimal akzeptierten,
-  // damit wir mit > arbeiten koennen, ist meistens egal, aber wenn kein
-  // Wert uebergeben wird ist strength = 0, in dem Fall duerfte aber
-  // mehrheitlich 1 gemeint sein.
-  --strength;
-  foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
+  // Wenn kein Wert uebergeben wird ist strength 0, in dem Fall duerfte aber
+  // mehrheitlich 1 gemeint sein. Daher auf 1 setzen, wenn 0 uebergeben wurde.
+  strength ||= 1;
+
+  if (intp(strength))
   {
-    if((intp(strength) && 
-      funcall(cl,this_object(),previous_object())>strength) ||
-      (closurep(strength) && funcall(strength,this_object(),cl)))
+    foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
     {
-      ob=get_type_info(cl,2);
-      break;
+      if(funcall(cl, this_object(), previous_object()) >= strength)
+      {
+        return get_type_info(cl,2);
+      }
     }
   }
-  return ob;
+  else
+  {
+    foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
+    {
+      ob=get_type_info(cl,2);
+      if(apply(strength, ob, funcall(cl, this_object(), previous_object()),
+               extra) )
+      {
+        return ob;
+      }
+    }
+  }
+
+  return 0;
 }