shadow


       shadow() - shadow one or more functions in some object



SYNOPSIS

       object shadow( object ob, int flag );



DESCRIPTION

       If `flag' is 1 or missing, then current object will shadow
       `ob'. If `flag' is 0, then either 0 will be  returned,  or
       the object that is already shadowing `ob'.

       The  master  object defines the function "valid_shadow()".
       If it returns 1 the target object can't be  shadowed,  and
       the "shadow()" function will return 0 instead of `ob'.

       If   an  object  `a'  shadows  an  object  `b',  then  all
       "call_other(func)" to `b' will be redirected  to  `a'.  If
       object  `a'  has  not  defined the function, then the call
       will be forwarded to `b' (as if  there  were  no  shadow).
       There  is  only  one object that can call functions in `b'
       with call_other(), and that is `a'. Not  even  object  `b'
       can  "call_other()" itself. All normal (internal) function
       calls inside `b' will however remain internal to `b'.

       There are two ways to remove the shadow.  Either  destruct
       it,  or  the object that was shadowed. In the latter case,
       the shadow will also be destructed automatically.

       The result is that it is possible to hide an object behind
       another  one,  but  everything can be totally transparent.
       The shadow() efunction makes it  possible  to  change  the
       behavior  of  an  object without changing the code for the
       object in question.  One possible use for shadow()  is  to
       add  special  capabilities  to  various classes of players
       (thief, fighter, mage, etc).  This  usage  would  make  it
       possible  to  keep  the player object much simpler than it
       could be if the code for the various classes had to be  in
       the player object itself.



SEE ALSO

       destruct(3),        shadowp(3),        query_shadowing(3),
       valid_shadow(4)