// Returns a wrapper function that returns a wrapped callback | |
// The wrapper function should do some stuff, and return a | |
// presumably different callback function. | |
// This makes sure that own properties are retained, so that | |
// decorations and such are not lost along the way. | |
module.exports = wrappy | |
function wrappy (fn, cb) { | |
if (fn && cb) return wrappy(fn)(cb) | |
if (typeof fn !== 'function') | |
throw new TypeError('need wrapper function') | |
Object.keys(fn).forEach(function (k) { | |
wrapper[k] = fn[k] | |
}) | |
return wrapper | |
function wrapper() { | |
var args = new Array(arguments.length) | |
for (var i = 0; i < args.length; i++) { | |
args[i] = arguments[i] | |
} | |
var ret = fn.apply(this, args) | |
var cb = args[args.length-1] | |
if (typeof ret === 'function' && ret !== cb) { | |
Object.keys(cb).forEach(function (k) { | |
ret[k] = cb[k] | |
}) | |
} | |
return ret | |
} | |
} | |