[NAME]
ALL.dao.class.aspect

[TITLE]
方面类

[DESCRIPTION]

在道语言里,一个修饰器类可以有效地用作面向方面(Aspect)编程里一个方面(Aspect)。 这只需要定义
一个自动应用修饰器类的目标模式。 这种带自动应用目标模式的修饰器类即为方面类。

这种类将按照其模式自动地作为组合类加入到匹配的目标类里。 结果就是这种类的成员将被自动地加入
到目标类里, 并且它所定义的带目标模式的修饰器方法也将自动地应用到目标类里 相应的方法上。

为了避免意外的方面类应用,一个普通类只有在定义时才可能被方面类所修改, 并且只能被定义处可见
的方面类修改。更进一步,只有同一个文件里定义的, 或直接载入的文件里定义的方面类才可在当前类里
定义。

方面类的自动应用目标模式跟修饰器方法的定义方式一样: 
     
   1  # 可应用到所有类的方面类:
   2  class @AspectForAnyClass for ~
   3  {
   4      var injected = {}
   5  
   6      # 这个是构造方法,不是修饰器方法!
   7      routine @AspectForAnyClass(){
   8          io.writeln( 'In @AspectForAnyClass():' );
   9          injected = { 1, 2, 3 }
  10      }
  11  
  12      # 这个修饰器方法也将被用到缺省的构造方法上: 
  13      routine @DecoratorForAnyMethod( meth(args) : routine ) for ~ {
  14          io.writeln( 'In @DecoratorForAnyMethod():', std.about(meth) )
  15          io.writeln( injected )
  16          return meth( args, ... )
  17      }
  18  }
  19  
  20  # 只可应用到类名带My前缀的类的方面类:
  21  class @AspectForMyClasses for My~
  22  {
  23      routine @Method( meth(args) : routine ) for Method~ {
  24          io.writeln( 'In @AspectForMyClasses::@Method():', std.about(meth) )
  25          return meth( args, ... )
  26      }
  27  }
  28  
  29  class MyClass
  30  {
  31      routine Method(){ io.writeln( 'MyClass::Method()' ) }
  32  }
  33  
  34  k = MyClass()  # 调用MyClass的缺省构造方法;
  35  k.Method()