docs: function disguiseThenable(target, source) {
    if (target === source) return target
  
    if (target.then instanceof Function) {
      var target_then = target.then
  
      function then(onFulfilled, onRejected) {
        if (onFulfilled != null) onFulfilled = onFulfilled.bind(target)
        if (onRejected != null) onRejected = onRejected.bind(target)
  
        var promise = target_then.call(target, onFulfilled, onRejected)
  
        return disguiseThenable(promise, source)
      }
  
      Object.defineProperties(target, {
        then: {
          value: then
        },
        catch: {
          value: promiseCatch
        }
      })
    }
  
    return disguise(target, source)
  }