[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")