// 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
}

}