
GetHelperObject()
*****************


FUNKTION
========

   public varargs object GetHelperObject(int type, int|closure
   strength
      varargs mixed* extra)


DEFINIERT IN
============

   /std/living/helpers.c


ARGUMENTE
=========

   type:
      Eine der in helpers.h definierten Konstanten

   strength:
      minimal geforderte Staerke des Helfers oder Closure zum Filtern
      der Helferobjekte.

   extra:
      Beliebige und beliebig viele Argumente, welche an die Closure
      <strength> weitergegeben werden.


BESCHREIBUNG
============

   Gibt das zuerst gefundene als Helfer registrierte Objekt zurueck,
   welches die Anforderungen erfuellt.

   Ist <strength> ein int, muss die Staerke/Guete des Helfers
   (Rueckgabewert der Callback-Methode, siehe RegisterHelperObject())
   mindestens so gross sein wie der als <strength> uebergebene Wert.

   Ist <strength> eine Closure, wird diese fuer jeden Helfer
   ausgewertet und entscheidet, ob der Helfer akzeptiert wird. Die
   Closure bekommt hierbei das Helferobjekt, die vom Helfer angegebene
   Staerke/Guete und etwaige hier als <extra> uebergebene Argument
   uebergeben. Ist der Rueckgabewert von <strength> != 0, wird der
   Helfer akzeptiert und von GetHelperObject zurueckgegeben (ohne
   weitere Helfer zu pruefen).


RUECKGABEWERT
=============

   Objekt welches den uebergebenen Anforderungen entspricht.


BEISPIELE
=========

   // Es wird ein Helfer zum Tauchen mit der Staerke 4 gesucht
   PL->GetHelperObject(HELPER_TYPE_AQUATIC, 4);

   // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
   // mindestens 60 cm gross und maximal 900 g schwer ist.
   PL->GetHelperObject(HELPER_TYPE_AERIAL, function int (object h, int s)
         { return s >= 4
           && h->QueryProp(P_SIZE) >= 60 && h->QueryProp(P_WEIGHT) <= 900;
         }
         );

   // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
   // mindestens 60 cm gross und maximal 900 g schwer ist, aber diese Grenzen
   // werden nicht in der Funktion festgelegt, sondern als <extra> uebergeben.
   PL->GetHelperObject(HELPER_TYPE_AERIAL,
         function int (object h, int s, int min_s, int minsize, int maxweight)
           { return s >= min_s
                  && h->QueryProp(P_SIZE) >= minsize
                  && h->QueryProp(P_WEIGHT) <= maxweight;
           },
         4, 60, 900);


SIEHE AUCH
==========

   RegisterHelperObject(), UnregisterHelperObject(), P_AERIAL_HELPERS,
   P_AQUATIC_HELPERS, P_HELPER_OBJECTS

Letzte Aenderung: 9.3.2018, Zesstra
