
Function.prototype.bind = function() {
    var self = this;
    var base = [];
    for (var i = 0; i < arguments.length; i++) base.push(arguments[i]);
        return function () {
            var args = [];
            for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
                return self.apply(null, base.concat(args));
        };
}

Function.prototype.compose = function(right) {
    var left = this;
    return function() {
        return left(right.apply(null, arguments));
    };
}

Function.prototype.methodOf = function(obj) {
    var self = this;
    return function() {
        return self.apply(obj, arguments);
    };
}

String.prototype.trim = function() {
    return this.replace(/^[ ]+|[ ]+$/g, '');
}

String.prototype.has = function(str) {
    if (str == "") return true;
    if (this.length < str.length) return false;
    if (this == str) return true;

    for (var i = 0, max = this.length - str.length; i <= max; i++) {
        if (this.substring(i, str.length + i) == str) return true;
    } 
    return false;
}

String.prototype.start = function(str) {
    if (!str) return false;
    return this.substring(0, str.length) == str;
}

String.prototype.x = function(i) {
    var ret = "";
    while (i-- > 0) {
        ret += this;
    }
    return ret;
}

function makeClass(){
    return function(args){
        if (this instanceof arguments.callee ) {
            if (typeof this.init == "function" )
                this.init.apply( this, args.callee ? args : arguments );
        } 
        else return new arguments.callee( arguments );
    };
}

Array.prototype.map = function(fn) {
    var ret = [];
    for (var i = 0, len = this.length; i < len; i++) {
        ret.push(fn(this[i]));
    }
    return ret;
};

Array.prototype.filter = function(fn) {
    var ret = [];
    for (var i = 0, len = this.length; i < len; i++) {
        if (fn(this[i])) {
            ret.push(this[i]);
        }
    }
    return ret;
};

Array.prototype.forEach = function(fn) {
    for (var i = 0, len = this.length; i < len; i++) {
        fn(this[i]);
    }
    return this;
};
