calls / shadow

Edit on Github


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


object shadow( object ob, int flag );


If  'flag'  is  1  or missing, then current object will shadow 'ob'. If
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 func‐
tion, 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.


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