"use strict"; module.exports = function(Promise, INTERNAL, tryConvertToPromise, apiRejection) { var util = require("./util.js"); var tryCatch = util.tryCatch; Promise.method = function (fn) { if (typeof fn !== "function") { throw new Promise.TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a"); } return function () { var ret = new Promise(INTERNAL); ret._captureStackTrace(); ret._pushContext(); var value = tryCatch(fn).apply(this, arguments); ret._popContext(); ret._resolveFromSyncValue(value); return ret; }; }; Promise.attempt = Promise["try"] = function (fn, args, ctx) { if (typeof fn !== "function") { return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a"); } var ret = new Promise(INTERNAL); ret._captureStackTrace(); ret._pushContext(); var value = util.isArray(args) ? tryCatch(fn).apply(ctx, args) : tryCatch(fn).call(ctx, args); ret._popContext(); ret._resolveFromSyncValue(value); return ret; }; Promise.prototype._resolveFromSyncValue = function (value) { if (value === util.errorObj) { this._rejectCallback(value.e, false, true); } else { this._resolveCallback(value, true); } }; };