lib/libs.js
function last (o, n) {
                    if(typeof o === 'boolean') return o;
                    var gotN = (!!n || n === 0);

                    n = parseInt(n, 10);
                    n = isNaN(n) || !isFinite(n) ? 1 : n;
                    var v = null, keys, len = libs.object.size(o), idx;

                    if(typeof o === 'boolean') {
                        return o;
                    }
                    else if(libs.object.isArguments(o)) {
                        keys = getKeys(o);
                        idx  = keys.indexOf('length');

                        if(idx > -1) keys.splice(idx, 1);
                        v = []; len = keys.length;
                        // Arguments object should ignore undefined members...
                        libs.object.each(keys, 0, len, function (k) { if(o[k] !== undefined) v.unshift(o[k]); });
                        v = v.slice(0, n);
                    }
                    else if(typeof o !== 'object') {
                        if(n !== 0) v = o.toString().slice(-n); else return null;
                    }
                    else if(o instanceof Array) {
                        if(n === 1 && !gotN) return o[o.length -1];
                        if(n === 0 && !gotN) return undefined;

                        return n !== 0 ? o.slice(-n) : [];
                    }
                    else {
                        v = {};
                        if(n < 0) n = 0;
                        libs.object.each(o, len - n, len, function (item, key) { v[key] = item; });
                        keys = getKeys(v);

                        if(n === 1 && !gotN && keys.length === 0) return undefined;
                        return keys.length === 1 && !gotN ? v[keys[0]] : v;
                    }
                    return v.length === 1 && !gotN ? v[0] : v;
                }
function last (o, n) {
                    if(typeof o === 'boolean') return o;
                    var gotN = (!!n || n === 0);

                    n = parseInt(n, 10);
                    n = isNaN(n) || !isFinite(n) ? 1 : n;
                    var v = null, keys, len = libs.object.size(o), idx;

                    if(typeof o === 'boolean') {
                        return o;
                    }
                    else if(libs.object.isArguments(o)) {
                        keys = getKeys(o);
                        idx  = keys.indexOf('length');

                        if(idx > -1) keys.splice(idx, 1);
                        v = []; len = keys.length;
                        // Arguments object should ignore undefined members...
                        libs.object.each(keys, 0, len, function (k) { if(o[k] !== undefined) v.unshift(o[k]); });
                        v = v.slice(0, n);
                    }
                    else if(typeof o !== 'object') {
                        if(n !== 0) v = o.toString().slice(-n); else return null;
                    }
                    else if(o instanceof Array) {
                        if(n === 1 && !gotN) return o[o.length -1];
                        if(n === 0 && !gotN) return undefined;

                        return n !== 0 ? o.slice(-n) : [];
                    }
                    else {
                        v = {};
                        if(n < 0) n = 0;
                        libs.object.each(o, len - n, len, function (item, key) { v[key] = item; });
                        keys = getKeys(v);

                        if(n === 1 && !gotN && keys.length === 0) return undefined;
                        return keys.length === 1 && !gotN ? v[keys[0]] : v;
                    }
                    return v.length === 1 && !gotN ? v[0] : v;
                }
Returns the last n elements of an object. If the object is an array, and only one items is retrieved,
that item will be returned rather than an array.
@param {Object} o The object to operate on.
@param {Number=} [n=1] The number of elements to return
@return {Array<*>} The last n elements of the array.
@function