docs: function () {
     // Return an empty object if no arguments are passed
     if (arguments.length === 0) return {};
  
     var base = arguments[0];
     var recursive = false;
     var len = arguments.length;
  
     // Check for recursive mode param
     if (typeof arguments[len - 1] === 'boolean') {
        recursive = arguments[len - 1];
        len -= 1; // Ignore the last arg
     }
  
     // Merging function used by Array#forEach()
     var do_merge = function (key) {
        var val = obj[key];
  
        // Set if unset
        if (!(key in base)) {
           base[key] = val;
        // If the value is an object and we use recursive mode, use defaults on
        // the value
        } else if (recursive && typeof val === 'object' &&
                   typeof base[key] === 'object') {
           defaults(base[key], val);
        }
        // Otherwise ignore the value
     };
  
     // Iterate over source objects
     for (var i=1; i < len; i++) {
        var obj = arguments[i];
  
        // Ignore falsy values
        if (!obj) continue;
  
        // Require object
        if (typeof obj !== 'object') {
           throw new Error('Expected argument at index ' + i +
                           ' to be an object');
        }
  
        // Merge keys
        Object.keys(obj).forEach(do_merge);
     }
  
     // Return the mutated base object
     return base;
  }