code: function coerce (type, obj, path, value) {
    if (isNil(path)) return;
  
    // Turn positive integer into string
    if (isPositiveInteger(path)) path = String(path);
  
    // Parse string path into an array
    if (isString(path)) {
      path = compact(path.trim().split(SEPERATOR));
    }
  
    // Return if path is invalid
    if (!path || !isArray(path) || path.length === 0) return;
  
    // Copy array for future use
    path = path.slice();
  
    // Shift the first path value
    var key = path.shift();
  
    // Return `undefined` if obj is `NaN` or `null` or `undefined`
    if (isNil(obj)) return;
  
    switch (type) {
      case 'get':
        if (path.length === 0) {
          return obj[key];
        }
        break;
      case 'set':
        if (path.length) {
          if (typeof obj[key] === 'undefined') {
            obj[key] = {};
          }
  
          if (isNil(obj[key])) return false;
        } else {
          obj[key] = value;
          return true;
        }
        break;
      case 'remove':
        if (path.length === 0) {
  
          if (isArray(obj) && isPositiveInteger(key)) {
            key = Number(key);
  
            if (obj.length - 1 < key) return false;
  
            obj.splice(key, 1);
          } else {
            if (!Object.hasOwnProperty.call(obj, key)) return false;
  
            delete obj[key];
          }
  
          return true;
        }
        break;
      case 'exists':
        if (path.length === 0) {
          if (isArray(obj) && isPositiveInteger(key)) {
            key = Number(key);
            return obj.length - 1 >= key;
          } else {
            return Object.hasOwnProperty.call(obj, key);
          }
        }
        break;
      default:
        return;
    }
  
    return coerce(type, obj[key], path, value);
  }
docs: /*!
  Coerce an object for specific action: `get`, `set`, `remove`, `exists`