[AOP][Prothon]

Inspirated by http://www.jroller.com/comments/deep?anchor=aop_fun_with_javascript
( JavaScriptによるAspectの実装方法。)

同じプロトタイプベースと言うことで、Prothonでも実装できないかなと考えてみた。
コードは prothon 0.1.2 向け。(APIはまだ安定していないので、頻繁に変更されている)

 # aspect.pr
 doc_ = """Aspect class for prothon"""

 def addBefore(obj, method_name, advice):
     oldFunc = obj.attrs_[method_name]
     def newFunc(*args, **kwds):
         return oldFunc{obj}(advice(*args, **kwds))
     obj.attrs_[method_name] = oldFunc

 # addAfter, addAround も同様のアプローチで定義できる。

 # advice関数先でオブジェクトを参照したい場合は、
 # method呼出にするといい(はず) func{obj}(*args, **kwds)

下は確認の為のテストコード。適切な Aspectの使い方ではないけど、
ここでは PointCut が出来ているのを確認できれば充分。

 import aspect

 object Greeting:
     def sayHello(name):
         print "Hello " + name

 def sayGoodBye(*args, **kwds):
     print "GoodBye " + args[0]
     return *args, **kwds

 aspect.addAfter(Greeting, "sayHello", sayGoodBye)

 Greeting.sayHello("Hina chan")
  • Class/Objectを辞書構造の変数に見立てて、メソッドを後から変更できること。
  • すべてのオブジェクトのrootとなる Object object(class) が advice を設定するメソッドを持っていれば便利になる? (AOPを意識したClass systemの設計)
  • 宣言型のclass構文に慣れると、classは静的なデータとしてあまり意識する事はないが、動的言語?(perl, ruby, python)だとclass/objectも辞書/ハッシュ データとして扱える。