function setOptions(object, source) {
      object = object || {}

      var objectTypes = {
        boolean: false,
        function: true,
        object: true,
        number: false,
        string: false,
        undefined: false
      }

      function isObject(value) {
        return !!(value && objectTypes[typeof value])
      }

      function keys(object) {
        if (!isObject(object)) {
          return []
        }

        return Object.keys(object)
      }

      var index
      var iterable = object
      var result = iterable

      var args = arguments
      var argsIndex = 0
      var argsLength = args.length

      // Loop variables:
      var ownIndex = -1
      var ownProps = objectTypes[typeof iterable] && keys(iterable)
      var length = ownProps ? ownProps.length : 0

      while (++argsIndex < argsLength) {
        iterable = args[argsIndex]

        if (iterable && objectTypes[typeof iterable]) {
          while (++ownIndex < length) {
            index = ownProps[ownIndex]

            if (
              typeof result[index] === 'undefined' ||
              result[index] === null
            ) {
              result[index] = iterable[index]
            } else if (isObject(result[index]) && isObject(iterable[index])) {
              result[index] = setOptions(result[index], iterable[index])
            } // Endif.
          } // End of while loop.
        } // Endif.
      } // End of while loop.

      return result
    }
Combine the given options and the default values.
<br /><br />

This function creating the real options object.

@param {object} options The options to configure.
@param {object} source The default configuration.