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

