code: function(obj, firstargs, loopfunc, endfunc) {
        var i, indexlimit, isarr;
        i = -1;
        isarr = 'Array' === Object.prototype.toString.call(obj).slice(8, -1);
        if (isarr) {
          indexlimit = obj.length;
        } else {
          indexlimit = Object.keys(obj).length;
        }
        return (this.y(function(func) {
          return function() {
            var key, value;
            i += 1;
            if (i < indexlimit) {
              if (isarr) {
                return loopfunc.apply(this, [
                  obj[i], i, function() {
                    return endfunc.apply(this, arguments);
                  }, function() {
                    return func.apply(this, arguments);
                  }
                ].concat(a(arguments)));
              } else {
                key = Object.keys(obj)[i];
                value = obj[key];
                return loopfunc.apply(this, [
                  key, value, function() {
                    return endfunc.apply(this, arguments);
                  }, function() {
                    return func.apply(this, arguments);
                  }
                ].concat(a(arguments)));
              }
            } else {
              return endfunc.apply(this, arguments);
            }
          };
        })).apply(this, firstargs);
      }
docs: /*
  for in Array or Object
  
  _for_in(obj, firstargs, loopfunc, endfunc)
  firstargs
  初回のloopfuncの引数を配列にして示します。
  [arg1,arg2]が渡されると、loopfunc(key,val,_break,_next,arg1,arg2)が呼ばれます。
  loopfunc(key,val,_break,_next,...)
  繰り返し実行する関数です。Objectの場合、key,valが得られます
  続行する場合_next(...)、中断する場合_break(...)を呼び出します。
  _nextの引数は、次回のloopfuncに渡されます。
  _breakの引数は、endfuncに渡されます。
  endfunc(...)
  繰り返しの終了時に呼ばれます。