PreventInsert()
***************


FUNKTION
========

   int PreventInsert(object ob);


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

   /std/container/restrictions.c


ARGUMENTE
=========

   ob
      Das Objekt, das in den Behaelter eingefuegt werden soll.


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

   Mit dieser Funktion kann ein Behaelter pruefen, ob er das Objekt ob
   aufnehmen moechte oder nicht.

   Man beachte bitte, dass nach dieser Funktion *nicht* garantiert
   ist, dass das Objekt wirklich bewegt wird, es handelt sich
   lediglich um die Abfrage der Erlaubnis! Die Bewegung kann aus einer
   Vielzahl an Gruenden noch abgebrochen werden.

   Wenn ob mit dem Flag M_NOCHECK bewegt wird, wird PreventInsert()
   zwar aufgerufen, aber das Ergebnis ignoriert, d.h. die Aufnahme
   kann in dem Fall nicht verhindert werden.


RUeCKGABEWERT
=============

   0
      wenn das Objekt aufgenommen werden kann;

   > 0
      ein Wert groesser als 0 zeigt an, dass das Objekt nicht
      aufgenommen werden soll.


BEISPIELE
=========

   Um zu verhindern, dass man Geld in einen Behaelter stecken kann,
   sollte man wie folgt vorgehen:

      public int PreventInsert(object ob)
      {
        // Wenn es Geld ist, erheben wir sofort Einspruch
        if (ob->id("geld"))
          return 1;
        // Ansonsten koennte ein ererbtes Objekt noch Einspruch erheben!
        else
          return ::PreventInsert(ob);
      }


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

   PreventLeave(), NotifyInsert(), NotifyLeave(), MayAddObject(),
   MayAddWeight(), PreventInsertLiving(), PreventLeaveLiving(),
   NotifyMove(), PreventMove(), move(), /std/container/restrictions.c

Last modified: 30.01.2020, Zesstra
