オブジェクトが実行可能になったら実行するなんか

最近、ブログパーツに特化したJSフレームワークを作りはじめている。
んで、createElementなんかでscriptをloadした時とか、いちいちタイミング調整したりしてごにょったりするのが、嫌になって来たので、queueに登録しておいて定期的にチェックするようなのを書いてみた。
setTimeout/clearTimeoutとかevalとか気持ち悪いので、もっといい方法がある気が。

if(typeof Widzzy == 'undefined') var Widzzy = function(){};
Widzzy.library_version = 0.01;

if(typeof Widzzy.LazyTask == 'undefined')
  Widzzy.LazyTask = function(){};

if(
  typeof Widzzy.LazyTask.version == 'undefined'
  || Widzzy.LazyTask.version < Widzzy.library_version
) {
  (function(){
    this.version = Widzzy.library_version;

    this.queue = new Array();

    this.interval = 100;

    this.timer = undefined;

    //task :{ action: function_object_name, args: array_of_arguments };
    this.register  = function(task) {
      this.queue.push(task);
      var _self = this;
      this.timer = setTimeout(
        function(){ return _self.tryExecusion.apply(_self);},
        _self.interval
      );
    }

    this.remove = function(task) {
      for(var i = 0; i < this.queue.length; i++) 
        if(this.queue[i].method == task.method
          && this.queue[i].args == task.args) this.queue.splice(i,1);
    }
 
    this.tryExecusion = function() {
      if(this.timer) clearTimeout(this.timer);
      var next_queue = [];
      while(this.queue.length > 0) {
        var task = this.queue.shift();
        var method = this.getMethod(task.action);
        if(method) {
          var obj = this.getBindTarget(task.action);
          method.apply(obj, task.args);
        } else {
          next_queue.push(task);
        }
      }
      if(next_queue.length > 0) {
        this.queue = next_queue;
        var _self = this;
        this.timer = setTimeout(
          function(){ return _self.tryExecusion.apply(_self);},
          _self.interval
        );
      }
    }

    this.getMethod = function(name) {
      var method;
      try {
        method = eval(name);
      } catch(e) {
        method = undefined;
      }
      return method;
    }

    this.getBindTarget = function(name) {
      var objName = name.replace(/.[^.]+$/,'');
      var obj;
      try {
        obj = eval(objName);
      } catch(e) {
        obj = window;
      }
      return obj;
    }
  }).apply(Widzzy.LazyTask);
}

使い方は、こんな感じ。Firebugのコンソールとかで試した方が多分わかりやすい。

Widzzy.LazyTask.register({action: 'Foo.bar',args:[1,2]});
var Foo = function(){};
(function(){ this.baz = 3; this.bar = function(a,b){ console.log(a + b + this.baz);}}).apply(Foo);


しばらくコレに割く時間があまり取れなさそうなので、途中で晒してみた。feedbackとかあると嬉しいです。