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.
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;
                }