home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / DATABASE / XCLAS20P.ZIP / XCLASS.CH < prev    next >
Encoding:
Text File  |  1993-03-30  |  5.8 KB  |  171 lines

  1. /*
  2.  
  3.                                  XCLASS
  4.        Librería-extensión Orientada al Objeto para Clipper 5.01
  5.                       (x) 1993 Carlos Ruiz Ruiz
  6.  
  7. Versión 2.0 - Marzo, 1993
  8. */
  9.  
  10. #ifndef _SET_DEFINED
  11.   #include "set.ch"
  12. #endif
  13.  
  14. #define XCTRL  ,,,,,,,,,,,,,,,,.f.
  15.  
  16. #command CLASS <name> [Inherit] [FROM <parent> [, <parentN>] ]  => ;
  17.   FUNCTION <name>( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, _Xinit );;
  18.   STATIC hClass, __bErr, bCons;;
  19.   LOCAL oNew, OldSetExact;;
  20.     if hClass == NIL;;
  21.       __bErr := ErrorBlock( { | oError | Eval( __bErr, oError ) } ) ;;
  22.       OldSetExact := set( _SET_EXACT, .t. );;
  23.       __DefineClass( <"name">,{ [{|| <parent>( XCTRL ) }] [, {|| <parentN>( XCTRL ) } ] } );;
  24.       [#define PARENTCLASS #<parent>]
  25.  
  26. #command protected => //Protected
  27. #command Exported  => //Exported
  28. #command Read Only => //Read Only
  29.  
  30. #command Protected Methods => //Protected Methods
  31. #command Public Methods    => //Public Methods
  32. #command Private Methods   => //Private Methods
  33.  
  34. #xcommand VAR <var1> [HIDDEN] [READONLY] [, <*VarN*>] => ;
  35.       __AddVar( <"var1"> ) [; VAR <VarN>]
  36.  
  37. #xcommand DATA <*formals*>  =>  VAR <formals>
  38.  
  39.  
  40. #command MESSAGE <mess> METHOD <udf> [, <*formals*> ]   => ;
  41.    MESSAGE <mess> METHOD <udf>();
  42.    [ ;MESSAGE <formals> ]
  43.  
  44. #command MESSAGE <mess> METHOD <udf>() [, <*formals*> ]  => ;
  45.    __AddMethod( { <"mess">, <"udf">, { | Self | <udf>( Self ) } } );
  46.    [ ;MESSAGE <formals> ]
  47.  
  48.  
  49. #command MESSAGE <mess> METHOD <udf>( <arg> [, <argN>] )  [, <*formals*> ] => ;
  50.    __AddMethod( { <"mess">, <"udf">, { | Self, <arg> [, <argN>] | <udf>( <arg> [, <argN> ], Self ) } } );
  51.    [ ;MESSAGE <formals> ]
  52.  
  53.  
  54. #command MESSAGE <mess>   [, <*formals*> ] => ;
  55.    MESSAGE <mess> METHOD <mess>();
  56.    [ ;MESSAGE <formals> ]
  57.  
  58.  
  59. #command MESSAGE <mess>() METHOD <udf> [, <*formals*> ]  => ;
  60.    MESSAGE <mess> METHOD <udf>;
  61.    [ ;MESSAGE <formals> ]
  62.  
  63.  
  64. #command MESSAGE <mess>(<arg,...>) METHOD <udf>  [, <*formals*> ]   => ;
  65.    MESSAGE <mess> METHOD <udf>( [<arg>] );
  66.    [ ;MESSAGE <formals> ]
  67.  
  68.  
  69. #command MESSAGE <mess>([<arg,...>]) METHOD <udf>()  [, <*formals*> ]  => ;
  70.    MESSAGE <mess> METHOD <udf>( [<arg>] );
  71.    [ ;MESSAGE <formals> ]
  72.  
  73.  
  74. #command MESSAGE <mess>([<u,...>]) METHOD <udf>( [<arg>,...> ] )  [, <*formals*> ]   => ;
  75.    MESSAGE <mess> METHOD <udf>( [<arg>] );
  76.    [ ;MESSAGE <formals> ]
  77.  
  78.  
  79. #command MESSAGE <mess>([<arg,...>])  [, <*formals*> ]   => ;
  80.    MESSAGE <mess> METHOD <mess>( [<arg>] );
  81.    [ ;MESSAGE <formals> ]
  82.  
  83.  
  84. #command MESSAGE <mess>()  [, <*formals*> ]    => ;
  85.    MESSAGE <mess> METHOD <mess>();
  86.    [ ;MESSAGE <formals> ]
  87.  
  88.  
  89. #command MESSAGE <mess> BLOCK <cblock>   [, <*formals*> ]   => ;
  90.    __AddMethod( { <"mess">, ,<cblock> } );
  91.    [ ;MESSAGE <formals> ]
  92.  
  93.  
  94. #command MESSAGE <mess>([<u,...>]) BLOCK <cblock> [, <*formals*> ]   =>;
  95.    MESSAGE <mess> BLOCK <cblock>;
  96.    [ ;MESSAGE <formals> ]
  97.  
  98.  
  99. #command MESSAGE <mess> = <udf>  [, <*formals*> ]  => ;
  100.    MESSAGE <mess> METHOD <udf>;
  101.    [ ;MESSAGE <formals> ]
  102.  
  103. #command MESSAGE <mess> VIRTUAL [, <*formals*>] => ;
  104.    MESSAGE <mess> BLOCK {||NIL};
  105.    [ ;MESSAGE <formals> ]
  106.  
  107. #xcommand CONSTRUCTOR <Mess> METHOD <Meth>( [<arg1>] [,<argN>]  ) => ;
  108.    bCons := {| Self [, <arg1>][, <argN> ] | <Meth>( [<arg1>,][<argN>,] Self ) };;
  109.    MESSAGE <Mess> METHOD <Meth>( [<arg1>] [,<argN>] )
  110.  
  111. #xcommand CONSTRUCTOR <Mess>( [<x,...>] )  => CONSTRUCTOR <Mess> METHOD <Mess>( [<x>] )
  112.  
  113. #xcommand RENAME [METHOD] [MESSAGE] <OldMess> [=] [TO] [AS] <NewMess> [, <*MessN*> ] => ;
  114.       __RenMethod( <"OldMess">, <"NewMess"> ) [; RENAME <MessN>]
  115.  
  116. #xcommand RENAME VAR <OldVar> [=] [TO] [AS] <NewVar> [, <*VarN*> ] => ;
  117.       __RenVar( <"OldVar">, <"NewVar"> ) [; RENAME VAR <VarN>]
  118.  
  119. #xcommand DELETE MESSAGE <mess>  => __DelMethod( <"mess"> )
  120. #xcommand DELETE METHOD <mess>  => __DelMethod( <"mess"> )
  121.  
  122. #xcommand DELETE VAR <Var>   => __DelVar( <"Var"> )
  123.  
  124.  
  125. #xcommand END CLASS [<*formals*>] => ENDCLASS
  126.  
  127. #xcommand ENDCLASS [<*formals*>] => ;
  128.       hClass := __XClassNew();;
  129.       set( _SET_EXACT, OldSetExact );;
  130.     end;;
  131.   oNew := __ClassIns(hClass);;
  132.   if bCons != NIL .and. _XInit == NIL;;
  133.      eval( bCons, oNew, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 );;
  134.   end;;
  135.   RETURN oNew
  136.  
  137. #xtranslate :: => self:
  138.  
  139. #ifdef DEBUG
  140.   #command METHOD [FUNCTION] <MName>( [<arg,...>] )  => ;
  141.     FUNCTION <MName>( [<arg>, ] xSelf );;
  142.       LOCAL Self := if( xSelf == NIL, Qself(), xSelf );;
  143.       LOCAL __bErr := ErrorBlock( { | oError | Eval( __bErr, oError ) } )
  144.  
  145.   #command METHOD PROCEDURE <MName>( [<arg,...>] ) => ;
  146.     PROCEDURE <MName>( [<arg>, ] xSelf );;
  147.       LOCAL Self := if( xSelf == NIL, Qself(), xSelf );;
  148.       LOCAL __bErr := ErrorBlock( { | oError | Eval( __bErr, oError ) } )
  149.  
  150. #else
  151.   #command METHOD [FUNCTION] <MName>( [<arg,...>] )  => ;
  152.     FUNCTION <MName>( [<arg>, ] xSelf );;
  153.       LOCAL Self := if( xSelf == NIL, Qself(), xSelf )
  154.  
  155.   #command METHOD PROCEDURE <MName>( [<arg,...>] ) => ;
  156.     PROCEDURE <MName>( [<arg>, ] xSelf );;
  157.       LOCAL Self := if( xSelf == NIL, Qself(), xSelf )
  158.  
  159. #endif
  160.  
  161. #translate :super( <pcl> ):<mess>( [<argN, ...>] ) => eval( superBlock( <(pcl)>, upper(<(mess)>) ), self [, <argN>] )
  162.  
  163. #translate :super():<mess>( [<argN, ...>] ) => eval( superBlock( PARENTCLASS, upper(<(mess)>) ), self [, <argN>] )
  164.  
  165. #translate :qsuper( <pcl>, <static>  ):<mess>( [<argN, ...>] )  => eval( if( <static> == nil, <static> := superBlock( <(pcl)>, upper(<(mess)>), @<static> ), <static>), self [,<argN>] )
  166. #translate :qsuper( <static>  ):<mess>( [<argN, ...>] )         => eval( if( <static> == nil, <static> := superBlock( PARENTCLASS, upper(<(mess)>), @<static> ), <static>), self [,<argN>] )
  167.  
  168. #translate ::parent:<mess>( [<args,...>] ) => ;
  169.    :super():<mess>( [<args>] )
  170.  
  171.