var wrappy = require('wrappy'); module.exports = wrappy(once); module.exports.strict = wrappy(onceStrict); once.proto = once(function () { Object.defineProperty(Function.prototype, 'once', { value: function () { return once(this); }, configurable: true, }); Object.defineProperty(Function.prototype, 'onceStrict', { value: function () { return onceStrict(this); }, configurable: true, }); }); function once(fn) { var f = function () { if (f.called) return f.value; f.called = true; return (f.value = fn.apply(this, arguments)); }; f.called = false; return f; } function onceStrict(fn) { var f = function () { if (f.called) throw new Error(f.onceError); f.called = true; return (f.value = fn.apply(this, arguments)); }; var name = fn.name || 'Function wrapped with `once`'; f.onceError = name + " shouldn't be called more than once"; f.called = false; return f; }