
shadow()
********


FUNKTION
========

   object shadow(object ob, int flag)


ARGUMENTE
=========

   object ob          - das vom shadow betroffene Objekt
   int flag           - 0 fuer eine Shadow-Existenzabfrage
                    1 fuer Shadow durch previous_object()


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

   Wenn <flag> nicht 0 ist, wird das aktuelle Objekt dem Objekt obj
   als Shadow uebergeworfen. Bei Erfolg wird das geshadowte Objekt
   zurueckgegeben, sonst 0.
   Wenn <flag> 0 ist, wird entweder 0 oder das geshadowte Objekt
   zurueck gegeben.

   Wenn ein Objekt A ein Objekt B beschattet, werden alle call_other() fuer
   B auf A umgeleitet. Wenn die an B gerufene Funktion in A existiert, so
   wird sie in A gerufen, bei Nichtexistenz in B.
   A ist das einzige Objekt, welche die beschatteten Funktionen mit
   call_other() in B aufrufen kann, selbst B kann nicht per call_other()
   diese Funktion rufen.
   Alle intern verwendeten Funktionen arbeiten jedoch weiterhin normal.

   Das aufrufende Objekt muss vom Master-Objekt die Erlaubnis haben,
   als Shadow zu wirken.

   Es gibt folgende Kriterien fuer eine erfolgreiche Beschattung:
   - das zu beschattende Objekt ob:
     - ist weder ein access_rights-Objekt noch ein ROOT-Objekt
     - gibt beim Aufruf von query_prevent_shadow(beschatter) eine 0
       zurueck
     - beschattet selbst niemanden
     - hat kein '#pragma no_shadow' gesetzt
   - der Beschatter:
     - wird nicht selbst (direkt) beschattet
     - beschattet noch niemanden (sonst folgt direkter Abbruch)
     - hat kein environment()
     - definiert/beschattet keine Methode, die im beschatteten Objekt ob
       als nomask definiert ist

   Beschattet man ein Objekt A mit einem Objekt B und dann das Objekt A
   zusaetzlich mit einem Objekt C, so wird eine Beschattungshierarchie
   erstellt:

   B macht shadow(A, 1)
   B->A
   C macht shadow(A, 1)
   C->B->A


BEISPIELE
=========

   // wenn: B beschattet A, dann
   shadow(find_object(A), 0) == B


   // 3 Objekte beschatten in Hierarchie (liegt auch im Pfad)
   --- aa.c ---
   void fun() {
       printf("%O [a] fun()\n", this_object());
   }

   void fun3() {
       printf("%O [a] fun3()\n", this_object());
   }

   --- bb.c ---
   int fun() {
       printf("%O [b] fun()\n", this_object());
       find_object("/doc/beispiele/shadow/aa")->fun();
   }

   void fun2() {
       printf("%O [b] fun2()\n", this_object());
       find_object("/doc/beispiele/shadow/aa")->fun3();
       this_object()->fun3();
   }

   void do_shadow(object target) { shadow(target, 1); }

   --- cc.c ---
   int fun() {
       printf("%O [c] fun()\n", this_object());
       find_object("/doc/beispiele/shadow/aa")->fun();
   }

   void fun3() {
       printf("%O [c] fun3()\n", this_object());
   }

   void do_shadow(object target) { shadow(target, 1); }

   // darauf arbeitender Code

   object a, b, c;

   destruct("/doc/beispiele/shadow/aa");
   a = load_object("/doc/beispiele/shadow/aa");
   destruct("/doc/beispiele/shadow/bb");
   b = load_object("/doc/beispiele/shadow/bb");
   destruct("/doc/beispiele/shadow/cc");
   c = load_object("/doc/beispiele/shadow/cc");

   b->do_shadow(a);
   c->do_shadow(a);
   printf("--- a->fun() ---\n");
   a->fun();
   printf("--- b->fun() ---\n");
   b->fun();
   printf("--- c->fun() ---\n");
   c->fun();
   printf("--- b->fun2() ---\n");
   b->fun2();

   // ... und seine Ausgabe:

   --- a->fun() ---
   /doc/beispiele/shadow/cc [c] fun()
   /doc/beispiele/shadow/bb [b] fun()
   /doc/beispiele/shadow/aa [a] fun()
   --- b->fun() ---
   /doc/beispiele/shadow/cc [c] fun()
   /doc/beispiele/shadow/bb [b] fun()
   /doc/beispiele/shadow/aa [a] fun()
   --- c->fun() ---
   /doc/beispiele/shadow/cc [c] fun()
   /doc/beispiele/shadow/bb [b] fun()
   /doc/beispiele/shadow/aa [a] fun()
   --- b->fun2() ---
   /doc/beispiele/shadow/bb [b] fun2()
   /doc/beispiele/shadow/aa [a] fun3()
   /doc/beispiele/shadow/cc [c] fun3()

   // Der erste Aufruf von b::fun2() in a findet sofort a::fun3()! Der
   // Driver nimmt an, dass alle Shadows ab c bei Rufen von b nach a
   // schon ihre Chance hatten.
   // Der zweite Aufruf allerdings ist auf b und wird beim Durchgeben
   // an a von c uebernommen.


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

   Generell:       shadow(E)
   Rechte:         query_allow_shadow(M), query_prevent_shadow(L)
   Informationen:  query_shadowing(E)

8.Aug 2007 Gloinson
