/**

* Extend +destination+ with +source+
*/

function extend(destination, source) {

for (var property in source) {
  destination[property] = source[property];
}
return destination;

}

/**

* Dump the properties out a String returned by the function.
*/

function dumpProperties(_this) {

var dumpStr = "";
for (var propName in _this) {
  if (_this.hasOwnProperty(propName)) {
    if (dumpStr !== "") {
      dumpStr += ", ";
    }
    dumpStr += (propName + "=" + _this[propName]);
  }
}

return dumpStr;

};

function getMethods(_this) {

var methods = [];
for (var m in _this) {
  //if (typeof _this[m] == "function" && _this.hasOwnProperty(m)) {
  if (typeof _this[m] == "function") {
    methods.push(m);
  }
}
return methods;

}

extend(Array.prototype, {

/**
 * Applies the given function to each element in the array until a
 * match is made. Otherwise returns null.
 * */
contains: function(f) {
  for (i = 0; i < this.length; i++) {
    if (f(this[i])) {
      return this[i];
    }
  }
  return null;
},

unique:  function() {
  function onlyUnique(value, index, self) {
    return self.indexOf(value) === index;
  }

  return this.filter(onlyUnique);
}

});

String.prototype.trim = function() {

return this.replace(/^\s+|\s+$/g,"");

};

String.prototype.ltrim = function() {

return this.replace(/^\s+/,"");

};

String.prototype.rtrim = function() {

return this.replace(/\s+$/,"");

};

String.prototype.lcfirst = function() {

return this.charAt(0).toLowerCase() + this.substr(1);

};