code: function invert (o) {
                      if(o === null || o === undefined) return o;
                      if(typeof o === 'string')   return libs.string.reverse(o);
                      if(typeof o === 'number')   return 1 / o;
                      if(typeof o === 'boolean')  return !o;
  
                      if(typeof o === 'function') {
                          return function () { return libs.object.invert(o.apply(o, arguments)); };
                      }
  
                      var obj = {};
                      libs.object.each(o, function (item, key) {
                          if(typeof item === 'string' || typeof item === 'number') {
                              if(!obj[item]) {
                                  obj[item] = key;
                              }
                              else {
                                  var tmp = obj[item];
                                  obj[item] = [];
                                  obj[item].push(tmp, key);
                              }
                          }
                      });
  
                      return obj;
                  }
docs: For objects, inverts the objects keys/values. If the value isn't a number or array, it will be omitted.
  For strings, it will reverse the string.
  For number, it will compute the number's inverse (i.e. 1 / x).
  For functions, invert returns a new function that wraps the given function and inverts it's result.
  @param {Object} o The object to operate on.
  @return {*} The inverse, as described above.