|  |  | 
|  | /** | 
|  | * HOP ref. | 
|  | */ | 
|  |  | 
|  | var has = Object.prototype.hasOwnProperty; | 
|  |  | 
|  | /** | 
|  | * Return own keys in `obj`. | 
|  | * | 
|  | * @param {Object} obj | 
|  | * @return {Array} | 
|  | * @api public | 
|  | */ | 
|  |  | 
|  | exports.keys = Object.keys || function(obj){ | 
|  | var keys = []; | 
|  | for (var key in obj) { | 
|  | if (has.call(obj, key)) { | 
|  | keys.push(key); | 
|  | } | 
|  | } | 
|  | return keys; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Return own values in `obj`. | 
|  | * | 
|  | * @param {Object} obj | 
|  | * @return {Array} | 
|  | * @api public | 
|  | */ | 
|  |  | 
|  | exports.values = function(obj){ | 
|  | var vals = []; | 
|  | for (var key in obj) { | 
|  | if (has.call(obj, key)) { | 
|  | vals.push(obj[key]); | 
|  | } | 
|  | } | 
|  | return vals; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Merge `b` into `a`. | 
|  | * | 
|  | * @param {Object} a | 
|  | * @param {Object} b | 
|  | * @return {Object} a | 
|  | * @api public | 
|  | */ | 
|  |  | 
|  | exports.merge = function(a, b){ | 
|  | for (var key in b) { | 
|  | if (has.call(b, key)) { | 
|  | a[key] = b[key]; | 
|  | } | 
|  | } | 
|  | return a; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Return length of `obj`. | 
|  | * | 
|  | * @param {Object} obj | 
|  | * @return {Number} | 
|  | * @api public | 
|  | */ | 
|  |  | 
|  | exports.length = function(obj){ | 
|  | return exports.keys(obj).length; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Check if `obj` is empty. | 
|  | * | 
|  | * @param {Object} obj | 
|  | * @return {Boolean} | 
|  | * @api public | 
|  | */ | 
|  |  | 
|  | exports.isEmpty = function(obj){ | 
|  | return 0 == exports.length(obj); | 
|  | }; |