[NAME]
ALL.dao.class.decorator

[TITLE]
Class Decorator (Removed)

[DESCRIPTION]

WARNING: This feature has been removed!

Class decorators are classes (prefixed with @) that can be used modify other classes. The
modification is done by using such class as a mixin base class to inject (combine) its me
mbers into the modified class, and by automatically applying its method decorators the me
thods of the modified class.

For such auto decorator application, only decorators with explicitly specified decoration
targets are automatically applied. Such targets are expressed as prefix and suffix rules 
which can be expressed in the following ways: 
  *  Prefix~ : a prefix pattern.
     The decorator will be auto applied to methods that have names  with such prefix; 
  *  ~Suffix : a suffix pattern.
     The decorator will be auto applied to methods that have names  with such suffix; 
  *  Prefix~Suffix : a prefix and suffix pattern.
     The decorator will be auto applied to methods that have names  with such prefix and 
     suffix; 
  *  ~ : an empty prefix and suffix pattern.
     The decorator will be auto applied to any methods. 


When multiple mixin bases are used in a host class, the decorators of the first mixin bas
e are applied the last. An the first decorator of the same decorator is also applied the 
last as well.
     
   1  class @Header
   2  {
   3      static routine @Delimiter( meth(args) : routine ) for ~ { 
   4          io.writeln( '=======================' )
   5          return meth( args, ... )
   6      }   
   7      routine @Delimiter( meth(args) : routine ) for ~ { 
   8          io.writeln( '-----------------------' )
   9          return meth( args, ... )
  10      }   
  11  }
  12  class @Decorator
  13  {
  14      var value = 654321
  15  
  16      routine @Test( meth(args) : routine<self:@Decorator> ) for Test {
  17          io.writeln( 'Decorator::Test()', value )
  18          meth( args, ... );
  19      }   
  20      routine @Prefix( meth(args) : routine<self:@Decorator> ) for Prefix~ {
  21          io.writeln( 'Decorator::Prefix()' )
  22          meth( args, ... );
  23      }
  24      routine @Suffix( meth(args) : routine<self:@Decorator> ) for ~Suffix {
  25          io.writeln( 'Decorator::Suffix()' )
  26          meth( args, ... );
  27      }
  28      routine @Prefix_Suffix( meth(args) : routine<self:@Decorator> ) for Prefix~Suffix {
  29          io.writeln( 'Decorator::Prefix_Suffix()' )
  30          meth( args, ... );
  31      }
  32  }
  33  
  34  class MyMixin ( @Header, @Decorator )
  35  {
  36      routine Test(){
  37          io.writeln( 'MyMixin::Test()' )
  38      }
  39      routine PrefixTest(){
  40          io.writeln( 'MyMixin::PrefixTest()' )
  41      }
  42      routine TestSuffix(){
  43          io.writeln( 'MyMixin::TestSuffix()' )
  44      }
  45      routine PrefixTestSuffix(){
  46          io.writeln( 'MyMixin::PrefixTestSuffix()' )
  47      }
  48  }
  49  
  50  obj = MyMixin()
  51  obj.Test()
  52  obj.PrefixTest()
  53  obj.TestSuffix()
  54  obj.PrefixTestSuffix()