Logger

http://secure.ddo.jp/~kaku/tdiary/20060919.html
オレジュで取り上げてもらって嬉しいので、Object.Aspectを使ったメソッドの呼び出しをloggerに渡すものを載せてみる。

Object.Aspect.Logger = Class.create();
Object.Aspect.Logger.prototype = {
    initialize: function(target, methodNames, logger){
        this.logger = window["logger"] || {
            debug: function(msg){ alert(msg) },
            warn: function(msg){ alert("[warn]" + msg) }
        };
        Object.Aspect.around(target, methodNames, this.invokeMethod);
    },
    invokeMethod: function(invocation){
        var s = invocation.methodName+"("+ $A(invocation.arguments).join(",") +")";
        try{
            var result = invocation.proceed();
            this.logger.debug("[debug]" + s + " ==> " + result);
            return result;
        }catch(ex){
            this.logger.debug("[warn]" + s + " >>>> " + ex);
            throw ex;
        }
    }
};

loggerオブジェクトはdebugとwarnメソッドを持っていればOK。loggerを指定しなければ、グローバルなloggerオブジェクトか、毎回alertしてしまう気の利かない簡易ロガーが使われる。
methodNamesは、指定しないとオブジェクトのメソッド全部を対象にしてしまうので要注意。
メソッド呼び出しの深さによってツリーっぽく出力したいなーとか思ったんだけど、面倒くさいので結局やめちゃった。


この辺りのソースは、http://code.google.com/p/asyrinx/ にあります。自家製Loggerとかカレンダーコントロールなどもありますので、良かったらどうぞ。