| "use strict"; | 
| module.exports = function(Promise) { | 
| var util = require("./util"); | 
| var async = Promise._async; | 
| var tryCatch = util.tryCatch; | 
| var errorObj = util.errorObj; | 
|   | 
| function spreadAdapter(val, nodeback) { | 
|     var promise = this; | 
|     if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); | 
|     var ret = | 
|         tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); | 
|     if (ret === errorObj) { | 
|         async.throwLater(ret.e); | 
|     } | 
| } | 
|   | 
| function successAdapter(val, nodeback) { | 
|     var promise = this; | 
|     var receiver = promise._boundValue(); | 
|     var ret = val === undefined | 
|         ? tryCatch(nodeback).call(receiver, null) | 
|         : tryCatch(nodeback).call(receiver, null, val); | 
|     if (ret === errorObj) { | 
|         async.throwLater(ret.e); | 
|     } | 
| } | 
| function errorAdapter(reason, nodeback) { | 
|     var promise = this; | 
|     if (!reason) { | 
|         var newReason = new Error(reason + ""); | 
|         newReason.cause = reason; | 
|         reason = newReason; | 
|     } | 
|     var ret = tryCatch(nodeback).call(promise._boundValue(), reason); | 
|     if (ret === errorObj) { | 
|         async.throwLater(ret.e); | 
|     } | 
| } | 
|   | 
| Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, | 
|                                                                      options) { | 
|     if (typeof nodeback == "function") { | 
|         var adapter = successAdapter; | 
|         if (options !== undefined && Object(options).spread) { | 
|             adapter = spreadAdapter; | 
|         } | 
|         this._then( | 
|             adapter, | 
|             errorAdapter, | 
|             undefined, | 
|             this, | 
|             nodeback | 
|         ); | 
|     } | 
|     return this; | 
| }; | 
| }; |