{"_id":"kareem","_rev":"20-7c85e1965c4bd7bfcb0640eea6b8117b","name":"kareem","description":"Next-generation take on pre/post function hooks","dist-tags":{"latest":"1.0.1"},"versions":{"0.0.1":{"name":"kareem","version":"0.0.1","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"devDependencies":{"acquit":"0.0.3","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","_id":"kareem@0.0.1","dist":{"shasum":"9991dadd22c0c7350b74b44c5bbda3cf56e593a3","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.1.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.2":{"name":"kareem","version":"0.0.2","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.2","dist":{"shasum":"aad21a4ed01a2a86bfd8c892a27707778d661439","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.2.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.3":{"name":"kareem","version":"0.0.3","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.3","dist":{"shasum":"017a5e0b421828701eed2c9ae94b107e845538bc","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.3.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.4":{"name":"kareem","version":"0.0.4","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.4","dist":{"shasum":"a8475defd74cf829b0071d20e6971bf15d911d2b","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.4.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.5":{"name":"kareem","version":"0.0.5","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","istanbul":"0.3.5","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.5","dist":{"shasum":"d900360c4857fb29729cb9191d8c44e99eefdc52","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.5.tgz"},"_from":".","_npmVersion":"1.3.24","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.6":{"name":"kareem","version":"0.0.6","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","istanbul":"0.3.5","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.6","dist":{"shasum":"702e898970c2de9dcf2a34ec22f458eccb7bab91","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.6.tgz"},"_from":".","_npmVersion":"1.3.24","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"directories":{}},"0.0.7":{"name":"kareem","version":"0.0.7","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","istanbul":"0.3.5","mocha":"2.0.0"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","gitHead":"98ef1734cac55f155303905537f953435f5099ff","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.7","_shasum":"731ca52caaafa852086b9b3db7f5d16989295502","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"dist":{"shasum":"731ca52caaafa852086b9b3db7f5d16989295502","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.7.tgz"},"directories":{}},"0.0.8":{"name":"kareem","version":"0.0.8","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","gulp":"3.8.10","gulp-mocha":"2.0.0","gulp-jscs":"1.4.0","istanbul":"0.3.5","jscs":"1.9.0","mocha":"2.0.0"},"jscsConfig":{"preset":"airbnb","requireMultipleVarDecl":null,"disallowMultipleVarDecl":true},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","gitHead":"03c0d2f3de089fd4fdd2d7c2191e45ee2b0cca00","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@0.0.8","_shasum":"0857e573d09e40e6dd39a5d6437ea1c4a9d351a1","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"dist":{"shasum":"0857e573d09e40e6dd39a5d6437ea1c4a9d351a1","tarball":"http://registry.npmjs.org/kareem/-/kareem-0.0.8.tgz"},"directories":{}},"1.0.0":{"name":"kareem","version":"1.0.0","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","gulp":"3.8.10","gulp-mocha":"2.0.0","gulp-jscs":"1.4.0","istanbul":"0.3.5","jscs":"1.9.0","mocha":"2.0.0"},"jscsConfig":{"preset":"airbnb","requireMultipleVarDecl":null,"disallowMultipleVarDecl":true},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","gitHead":"4c5a35ac2a34b3d9c90db9fd1007b58ba5b4eec0","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@1.0.0","_shasum":"18b854380b83b10608c710fc951e7910184f67a6","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"dist":{"shasum":"18b854380b83b10608c710fc951e7910184f67a6","tarball":"http://registry.npmjs.org/kareem/-/kareem-1.0.0.tgz"},"directories":{}},"1.0.1":{"name":"kareem","version":"1.0.1","description":"Next-generation take on pre/post function hooks","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha ./test/*","test-travis":"./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- -R spec ./test/*"},"repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"devDependencies":{"acquit":"0.0.3","gulp":"3.8.10","gulp-mocha":"2.0.0","gulp-jscs":"1.4.0","istanbul":"0.3.5","jscs":"1.9.0","mocha":"2.0.0"},"jscsConfig":{"preset":"airbnb","requireMultipleVarDecl":null,"disallowMultipleVarDecl":true},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","gitHead":"69710887f85dee09afac690df770dd2febde7268","bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"homepage":"https://github.com/vkarpov15/kareem","_id":"kareem@1.0.1","_shasum":"7805d215bb53214ec3af969a1d0b1f17e3e7b95c","_from":".","_npmVersion":"2.7.4","_nodeVersion":"0.12.2","_npmUser":{"name":"vkarpov15","email":"valkar207@gmail.com"},"maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"dist":{"shasum":"7805d215bb53214ec3af969a1d0b1f17e3e7b95c","tarball":"http://registry.npmjs.org/kareem/-/kareem-1.0.1.tgz"},"directories":{}}},"readme":"# kareem\n\n [![Build Status](https://travis-ci.org/vkarpov15/kareem.svg?branch=master)](https://travis-ci.org/vkarpov15/kareem)\n [![Coverage Status](https://img.shields.io/coveralls/vkarpov15/kareem.svg)](https://coveralls.io/r/vkarpov15/kareem)\n\nRe-imagined take on the [hooks](http://npmjs.org/package/hooks) module, meant to offer additional flexibility in allowing you to execute hooks whenever necessary, as opposed to simply wrapping a single function.\n\nNamed for the NBA's all-time leading scorer Kareem Abdul-Jabbar, known for his mastery of the [hook shot](http://en.wikipedia.org/wiki/Kareem_Abdul-Jabbar#Skyhook)\n\n\n\n# API\n\n## pre hooks\n\nMuch like [hooks](https://npmjs.org/package/hooks), kareem lets you define\npre and post hooks: pre hooks are called before a given function executes.\nUnlike hooks, kareem stores hooks and other internal state in a separate\nobject, rather than relying on inheritance. Furthermore, kareem exposes\nan `execPre()` function that allows you to execute your pre hooks when\nappropriate, giving you more fine-grained control over your function hooks.\n\n\n#### It runs without any hooks specified\n\n```javascript\n \n hooks.execPre('cook', null, function() {\n done();\n });\n \n```\n\n#### It runs basic serial pre hooks\n\npre hook functions take one parameter, a \"done\" function that you execute\nwhen your pre hook is finished.\n\n\n```javascript\n \n var count = 0;\n\n hooks.pre('cook', function(done) {\n ++count;\n done();\n });\n\n hooks.execPre('cook', null, function() {\n assert.equal(1, count);\n done();\n });\n \n```\n\n#### It can run multipe pre hooks\n\n```javascript\n \n var count1 = 0;\n var count2 = 0;\n\n hooks.pre('cook', function(done) {\n ++count1;\n done();\n });\n\n hooks.pre('cook', function(done) {\n ++count2;\n done();\n });\n\n hooks.execPre('cook', null, function() {\n assert.equal(1, count1);\n assert.equal(1, count2);\n done();\n });\n \n```\n\n#### It can run fully synchronous pre hooks\n\nIf your pre hook function takes no parameters, its assumed to be\nfully synchronous.\n\n\n```javascript\n \n var count1 = 0;\n var count2 = 0;\n\n hooks.pre('cook', function() {\n ++count1;\n });\n\n hooks.pre('cook', function() {\n ++count2;\n });\n\n hooks.execPre('cook', null, function(error) {\n assert.equal(null, error);\n assert.equal(1, count1);\n assert.equal(1, count2);\n done();\n });\n \n```\n\n#### It properly attaches context to pre hooks\n\nPre save hook functions are bound to the second parameter to `execPre()`\n\n\n```javascript\n \n hooks.pre('cook', function(done) {\n this.bacon = 3;\n done();\n });\n\n hooks.pre('cook', function(done) {\n this.eggs = 4;\n done();\n });\n\n var obj = { bacon: 0, eggs: 0 };\n\n // In the pre hooks, `this` will refer to `obj`\n hooks.execPre('cook', obj, function(error) {\n assert.equal(null, error);\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n done();\n });\n \n```\n\n#### It can execute parallel (async) pre hooks\n\nLike the hooks module, you can declare \"async\" pre hooks - these take two\nparameters, the functions `next()` and `done()`. `next()` passes control to\nthe next pre hook, but the underlying function won't be called until all\nasync pre hooks have called `done()`.\n\n\n```javascript\n \n hooks.pre('cook', true, function(next, done) {\n this.bacon = 3;\n next();\n setTimeout(function() {\n done();\n }, 5);\n });\n\n hooks.pre('cook', true, function(next, done) {\n next();\n var _this = this;\n setTimeout(function() {\n _this.eggs = 4;\n done();\n }, 10);\n });\n\n hooks.pre('cook', function(next) {\n this.waffles = false;\n next();\n });\n\n var obj = { bacon: 0, eggs: 0 };\n\n hooks.execPre('cook', obj, function() {\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n assert.equal(false, obj.waffles);\n done();\n });\n \n```\n\n## post hooks\n\n#### It runs without any hooks specified\n\n```javascript\n \n hooks.execPost('cook', null, [1], function(error, eggs) {\n assert.ifError(error);\n assert.equal(1, eggs);\n done();\n });\n \n```\n\n#### It executes with parameters passed in\n\n```javascript\n \n hooks.post('cook', function(eggs, bacon, callback) {\n assert.equal(1, eggs);\n assert.equal(2, bacon);\n callback();\n });\n\n hooks.execPost('cook', null, [1, 2], function(error, eggs, bacon) {\n assert.ifError(error);\n assert.equal(1, eggs);\n assert.equal(2, bacon);\n done();\n });\n \n```\n\n#### It can use synchronous post hooks\n\n```javascript\n \n var execed = {};\n\n hooks.post('cook', function(eggs, bacon) {\n execed.first = true;\n assert.equal(1, eggs);\n assert.equal(2, bacon);\n });\n\n hooks.post('cook', function(eggs, bacon, callback) {\n execed.second = true;\n assert.equal(1, eggs);\n assert.equal(2, bacon);\n callback();\n });\n\n hooks.execPost('cook', null, [1, 2], function(error, eggs, bacon) {\n assert.ifError(error);\n assert.equal(2, Object.keys(execed).length);\n assert.ok(execed.first);\n assert.ok(execed.second);\n assert.equal(1, eggs);\n assert.equal(2, bacon);\n done();\n });\n \n```\n\n## wrap()\n\n#### It wraps pre and post calls into one call\n\n```javascript\n \n hooks.pre('cook', true, function(next, done) {\n this.bacon = 3;\n next();\n setTimeout(function() {\n done();\n }, 5);\n });\n\n hooks.pre('cook', true, function(next, done) {\n next();\n var _this = this;\n setTimeout(function() {\n _this.eggs = 4;\n done();\n }, 10);\n });\n\n hooks.pre('cook', function(next) {\n this.waffles = false;\n next();\n });\n\n hooks.post('cook', function(obj) {\n obj.tofu = 'no';\n });\n\n var obj = { bacon: 0, eggs: 0 };\n\n var args = [obj];\n args.push(function(error, result) {\n assert.ifError(error);\n assert.equal(null, error);\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n assert.equal(false, obj.waffles);\n assert.equal('no', obj.tofu);\n\n assert.equal(obj, result);\n done();\n });\n\n hooks.wrap(\n 'cook',\n function(o, callback) {\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n assert.equal(false, obj.waffles);\n assert.equal(undefined, obj.tofu);\n callback(null, o);\n },\n obj,\n args);\n \n```\n\n## createWrapper()\n\n#### It wraps wrap() into a callable function\n\n```javascript\n \n hooks.pre('cook', true, function(next, done) {\n this.bacon = 3;\n next();\n setTimeout(function() {\n done();\n }, 5);\n });\n\n hooks.pre('cook', true, function(next, done) {\n next();\n var _this = this;\n setTimeout(function() {\n _this.eggs = 4;\n done();\n }, 10);\n });\n\n hooks.pre('cook', function(next) {\n this.waffles = false;\n next();\n });\n\n hooks.post('cook', function(obj) {\n obj.tofu = 'no';\n });\n\n var obj = { bacon: 0, eggs: 0 };\n\n var cook = hooks.createWrapper(\n 'cook',\n function(o, callback) {\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n assert.equal(false, obj.waffles);\n assert.equal(undefined, obj.tofu);\n callback(null, o);\n },\n obj);\n\n cook(obj, function(error, result) {\n assert.ifError(error);\n assert.equal(3, obj.bacon);\n assert.equal(4, obj.eggs);\n assert.equal(false, obj.waffles);\n assert.equal('no', obj.tofu);\n\n assert.equal(obj, result);\n done();\n });\n \n```\n\n## clone()\n\n#### It clones a Kareem object\n\n```javascript\n \n var k1 = new Kareem();\n k1.pre('cook', function() {});\n k1.post('cook', function() {});\n\n var k2 = k1.clone();\n assert.deepEqual(['cook'], Object.keys(k2._pres));\n assert.deepEqual(['cook'], Object.keys(k2._posts));\n \n```\n\n","maintainers":[{"name":"vkarpov15","email":"valkar207@gmail.com"}],"time":{"modified":"2015-05-10T16:09:15.642Z","created":"2014-12-12T05:06:06.930Z","0.0.1":"2014-12-12T05:06:06.930Z","0.0.2":"2014-12-12T05:09:33.082Z","0.0.3":"2014-12-12T21:02:05.037Z","0.0.4":"2014-12-13T20:08:39.750Z","0.0.5":"2015-01-01T19:25:18.799Z","0.0.6":"2015-01-01T19:26:56.889Z","0.0.7":"2015-01-04T23:34:43.812Z","0.0.8":"2015-01-27T22:14:31.482Z","1.0.0":"2015-01-28T21:00:30.725Z","1.0.1":"2015-05-10T16:09:15.642Z"},"author":{"name":"Valeri Karpov","email":"val@karpov.io"},"license":"Apache 2.0","readmeFilename":"README.md","homepage":"https://github.com/vkarpov15/kareem","repository":{"type":"git","url":"git://github.com/vkarpov15/kareem.git"},"bugs":{"url":"https://github.com/vkarpov15/kareem/issues"},"users":{"bojand":true},"_attachments":{},"_etag":"\"3KB69FSTLPHYF4Q4CP5U5CL62\""}