{"_id":"jsface","_rev":"39-368ef6d275655708787e52ce1317d225","name":"jsface","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support main, singleton, super call, private, mixins, plugins, AOP and more.","dist-tags":{"latest":"2.4.9"},"versions":{"2.0.0":{"name":"jsface","main":"jsface.js","description":"JsFace JavaScript Object-Oriented Programming library","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.0.0","keywords":["jsface","JsFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming"],"homepage":"https://github.com/tannhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tannhu/jsface/blob/master/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tannhu/jsface.git"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"_id":"jsface@2.0.0","_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6cb962fe7e98a203295579a3ff72916fe6c993d7","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.0.0.tgz","integrity":"sha512-yqFN2lB0gdsq0VeE4R5NdKjs1IqhXeeK8qIWmF0+HVjuzCVJr1o930aDJ8Z0+YGhXDCROCYV58Mi8v6Ovxhkwg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUqwqsF//dvlulob6WcbShMWsInHBf+UnHnDGIW6qSyQIgf6rLKkXqs6eldwLno6RWV3n7xF/pf2iIN31DVKh/pD8="}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}],"directories":{}},"2.0.1":{"name":"jsface","main":"jsface.js","description":"JsFace JavaScript Object-Oriented Programming library","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.0.1","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming"],"homepage":"https://github.com/tannhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tannhu/jsface/blob/master/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tannhu/jsface.git"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"_id":"jsface@2.0.1","_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ad20d543afa7cfc87a4e7a374d19ed453382e4b8","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.0.1.tgz","integrity":"sha512-hLQAFj5eeZ4LSrVVxzSWA1fMMvBw77w3MTpQvdclWH8d8XRKq1/BrSefxE5PybvKs3Uq0Y9EVvxrqyXAatIrFQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1VdqRtg7da0o/otsE+NDAg1FaYGghldQE7T7tZQMXWwIhALWg/J4d8gJ2iDtAYdS/BtDvBLTiWw0y4YKkjmtOycqu"}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}],"directories":{}},"2.0.2":{"name":"jsface","main":"jsface.js","description":"Small footprint, elegant, powerful, and cross platform JavaScript OOP library. Support singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.0.2","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tannhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tannhu/jsface/blob/master/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tannhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"_id":"jsface@2.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0ee710a58cb72af5d00d2c57597ba0b212caa9d9","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.0.2.tgz","integrity":"sha512-kLQ52GOOD89MYy2SKflcivFWyznhV3zGRQuG8VL2o+wuMSJgMYza76J9z+J5Nxg/+Nd6mMogFF0nuH/S1w92rQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJ95FohcFZmu7HSpbgSXzeAi2/ZCiSEHJUzFLEKH8PkQIgNRhAONq5Wx95XEwnII54/eR+TR6h/LZMf8XZ3HWPw8k="}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}]},"2.1.0":{"name":"jsface","main":"jsface.js","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.1.0","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tannhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tannhu/jsface/blob/master/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tannhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"_id":"jsface@2.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c6787fc96fac65663473fd57ee41e71a9bb49683","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.1.0.tgz","integrity":"sha512-9ojaPVJNI8IOyTU9qpGQwe527bh+jVCMwOTV/IReJ/rKzeC6PZcubQDEvq4ymq+Q6GeaQTLqi7H1qu2oRhA3hQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsMVcJZEu4ckWGbBr10F9254qgBOUvgGl+tdfeNPd0xwIgdSkiTkqsvOmoBh55kWls9ZV+IWqKdi//3TgxFk+CwQs="}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}]},"2.1.1":{"name":"jsface","main":"jsface.js","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.1.1","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tnhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tnhu/jsface/blob/master/LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tnhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"_id":"jsface@2.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b153f74aa5008c3629e1ed722fb147b19c811400","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.1.1.tgz","integrity":"sha512-muFoCOs0argU8zyX10q02loSjswksE+V3HVQvAnjsC10Rh2cvtatLLG6qYfTflDAXMX0dHFYOGPM76NNhBymSw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaP0YATDARIVsVlNbCSCcD+3lz6XxPUnollo2cNdc2xgIhAPLQ6oq0gj8k1DrVfUOsPz7FRSA/d28X0MOYrdT05zzh"}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}]},"2.2.0":{"name":"jsface","main":"jsface.js","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support main, singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.2.0","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tnhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tnhu/jsface/blob/master/LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tnhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"grunt":"~0.4.1","grunt-contrib-qunit":">=0.2.1","grunt-contrib-watch":">=0.3.1","grunt-contrib-uglify":">=0.2.0","grunt-contrib-copy":">=0.4.0","grunt-contrib-clean":"~0.5.0","grunt-contrib-concat":"~0.3.0"},"_id":"jsface@2.2.0","dist":{"shasum":"962b586754dab32ef42f6fa49c9a6cb002b19db1","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.2.0.tgz","integrity":"sha512-ms6d4xSRECRFrAiMgRgcWrmZTGaTsWlLBJCZR3Xroh2B5hlmLPFu+vBHvhUCboLzzMv56h6MuvNRpjJC5qixZQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBPotB4kbkCS74V1bvkpqPo5bndoF7jNhfvkH4YuNg5GAiBHmx3iJD2/kWzZh3h2kF/1xetDF5C1Kg6u4u/e9ZRMoA=="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}]},"2.3.0":{"name":"jsface","main":"jsface.js","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support main, singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.3.0","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tnhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tnhu/jsface/blob/master/LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tnhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"grunt":"~0.4.1","grunt-contrib-qunit":">=0.2.1","grunt-contrib-watch":">=0.3.1","grunt-contrib-uglify":">=0.2.0","grunt-contrib-copy":">=0.4.0","grunt-contrib-clean":"~0.5.0","grunt-contrib-concat":"~0.3.0"},"gitHead":"dc32ad90937a7e2d2f0ca8dd3b21995da8ee9687","bugs":{"url":"https://github.com/tnhu/jsface/issues"},"_id":"jsface@2.3.0","scripts":{},"_shasum":"339789585387ae8cfae157dbcb147faef3c4c14c","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}],"dist":{"shasum":"339789585387ae8cfae157dbcb147faef3c4c14c","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.3.0.tgz","integrity":"sha512-7fC+N4Pt6Zn/w9kuUbfft+tiWMZKRIM7mZRj38b40/Wj4w1O8mMHZiJ5C9gYHTVHOtWAnyR3S216nhZXHo8eIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGq8cMnp8YKVtmDMju2rw3Kx95ludkiwOJkVAfFwmJGwIgO8qV5gqT2UhOrM6ILGme9/HjS48RTwbWDuQRN9CD/8w="}]}},"2.4.9":{"name":"jsface","main":"jsface.js","description":"Small, fast, elegant, powerful, and cross platform JavaScript OOP library. Support main, singleton, super call, private, mixins, plugins, AOP and more.","author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"version":"2.4.9","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"homepage":"https://github.com/tnhu/jsface","licenses":[{"type":"MIT","url":"https://github.com/tnhu/jsface/blob/master/LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/tnhu/jsface.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"del":"^1.2.0","gulp":"^3.9.0","gulp-rename":"^1.2.2","gulp-uglify":"^1.2.0","run-sequence":"^1.1.2"},"gitHead":"fe99c986acbaa91ba17ccb8df51e70a860444869","bugs":{"url":"https://github.com/tnhu/jsface/issues"},"_id":"jsface@2.4.9","scripts":{},"_shasum":"0947de2a347f74d9fd12f0599fa3ef5ebfa33d84","_from":".","_npmVersion":"2.9.1","_nodeVersion":"0.12.2","_npmUser":{"name":"tannhu","email":"tnhu@me.com"},"dist":{"shasum":"0947de2a347f74d9fd12f0599fa3ef5ebfa33d84","tarball":"https://registry.npmjs.org/jsface/-/jsface-2.4.9.tgz","integrity":"sha512-WPfInk5AEd8MzFm/EDOfrlCj0xP81VIaZQgwPIdU4u1lpTqvQ+0o9Ea3lL9KRnuUNtAsxST93xOijM1E2AUDeA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJFSEKZLRedUG5+FX5BpoR4wi9BrkDaVmUAoHql2rEdwIgeCFob3iCvcziIQ0TTY/9dYw5duXMEbhGc9ajnpyAr0A="}]},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}]}},"maintainers":[{"name":"tannhu","email":"tnhu@me.com"}],"time":{"modified":"2022-06-19T06:00:49.313Z","created":"2011-12-11T06:56:42.162Z","2.0.0":"2011-12-11T06:56:43.294Z","2.0.1":"2012-01-17T03:41:27.865Z","2.0.2":"2012-03-10T09:15:04.308Z","2.1.0":"2012-03-16T01:50:09.181Z","2.1.1":"2012-04-26T08:01:09.143Z","2.2.0":"2013-10-14T10:41:35.425Z","2.3.0":"2014-12-02T22:31:01.992Z","2.4.9":"2015-07-23T23:46:06.157Z"},"author":{"name":"Tan Nhu","email":"tnhu AT me . com"},"repository":{"type":"git","url":"git://github.com/tnhu/jsface.git"},"readme":"![Benchmark result](https://lh5.googleusercontent.com/-2dQo8ttjn48/T2KVyppgd2I/AAAAAAAADQw/GvEpE5MIYUo/s956/Screen%2520Shot%25202012-03-15%2520at%25206.21.04%2520PM.png \"Benchmark\")\n\n[![Build Status](https://secure.travis-ci.org/tannhu/jsface.svg?branch=master)](http://travis-ci.org/tannhu/jsface)\n\n## Features\n\n* Small footprint, no dependency, 0.7K minimized+gzip!\n* Super fast! See [benchmark](http://jsperf.com/oop-benchmark/6).\n* Work on both server and client side.\n* Support CommonJS.\n* Support getter/setter, constant, main, singleton, mixin, private properties, Aspect Oriented Programming.\n* Plugins mechanism to extend itself.\n\n## Setup\n\nJSFace supports both server side (CommonJS) and client side JavaScript (browser).\n\n### Browser\n\n#### bower\n\n``` sh\nbower install jsface\n```\n\n``` html\n<script src=\"bower_components/jsface/jsface.js\"></script>\n```\n\n#### dnsjs\n\n``` javascript\n<script src=\"https://cdn.jsdelivr.net/jsface/2.4.8/jsface.min.js\"></script>\n```\n\n#### Manually\n\n``` html\n<script src=\"jsface.js\"></script>\n```\n\n### NodeJS environment\n\nFirst install JSFace via npm:\n\n``` sh\nnpm install jsface\n```\n\nThen use its APIs, for example:\n\n``` javascript\nvar jsface = require(\"jsface\"),\n    Class  = jsface.Class,\n    extend = jsface.extend;\n```\n\n## Usage\n\n### Define a class\n\n``` javascript\nvar Person = Class({\n  constructor: function(name, age) {\n    this.name = name;\n    this.age  = age;\n  },\n\n  // Getter/Setter\n  address: {\n    get: function() {\n      return this._address;\n    },\n    set: function(value) {\n      this._address = value;\n    }\n  },\n\n  toString: function() {\n    return this.name + \"/\" + this.age;\n  }\n});\n\nvar person = new Person(\"Rika\", 20);\nperson.toString();                               // \"Rika/20\"\n```\n\n### Define a sub-class\n\n``` javascript\nvar Student = Class(Person, {\n  constructor: function(id, name, age) {\n    this.id = id;\n    Student.$super.call(this, name, age);        // Call parent's constructor\n  },\n\n  toString: function() {\n    return this.id + \"/\" + Student.$superp.toString.call(this); // Call parent's toString method\n  }\n});\n\nvar student = new Student(1, \"Rika\", 20);\nstudent.toString();                              // \"1/Rika/20\"\n```\n\n### main\n\nJSFace supports a special method named main(). main() is executed right after the class is created.\n\n``` javascript\nClass({\n  constructor: function(name) {\n    this.name = name;\n  },\n\n  getName: function() {\n    return this.name;\n  },\n\n  main: function(Person) {                       // Class is passed to main() as its first argument\n    var p = new Person(\"Rika\");\n\n    p.getName();                                 // \"Rika\"\n  }\n});\n```\n\n### Singleton class\n\n``` javascript\nvar Util = Class({\n  $singleton: true,\n\n  echo: function(obj) {\n    return obj;\n  }\n});\n\nUtil.echo(2012);                                 // 2012\n```\n\n### Static properties\n\n``` javascript\nvar Person = Class({\n  $static: {\n    MIN_AGE:   1,\n    MAX_AGE: 150,\n\n    isValidAge: function(age) {\n      return age >= this.MIN_AGE && age <= this.MAX_AGE;\n    }\n  },\n\n  constructor: function(name, age) {\n    this.name = name;\n    this.age  = age;\n  }\n});\n\nPerson.MIN_AGE === 1;                            // true\nPerson.MAX_AGE === 150;                          // true\nPerson.isValidAge(0);                            // false\n```\n\n### Constants\n\nConstants work the same as static properties. The only different is they are immutable.\n\n``` javascript\nvar Person = Class({\n  $const: {\n    MIN_AGE: 1,\n    MAX_AGE: 150\n  },\n\n  constructor: function(name, age) {\n    this.name = name;\n    this.age  = age;\n  }\n});\n\nPerson.MIN_AGE = -1;\nPerson.MIN_AGE === 1;                            // true, MIN_AGE is immutable\n```\n\n\n### Private properties\n\nJSFace supports private static properties, meaning the properties are shared over instances.\n\n``` javascript\nvar Person = Class(function() {\n  var MIN_AGE =   1,                             // private variables\n      MAX_AGE = 150;\n\n  function isValidAge(age) {                     // private method\n    return age >= MIN_AGE && age <= MAX_AGE;\n  }\n\n  return {\n    constructor: function(name, age) {\n      if ( !isValidAge(age)) {\n        throw \"Invalid parameter\";\n      }\n\n      this.name = name;\n      this.age  = age;\n    }\n  };\n});\n```\n\n### Mixins\n\nJSFace provides a powerful mechanism to support mixins. Reusable code can be mixed into almost anything.\n\nMixin can be bound when you define classes:\n\n``` javascript\nvar Options = Class({\n  setOptions: function(opts) {\n    this.opts = opts;\n  }\n});\n\nvar Events = Class({\n  bind: function(event, fn) {\n    return true;\n  },\n  unbind: function(event, fn) {\n    return false;\n  }\n});\n\nvar Person = Class({\n  constructor: function(name, age) {\n    this.name = name;\n    this.age  = age;\n  }\n});\n\n// Student inherits Person and extends properties from Options and Events\nvar Student = Class([ Person, Options, Events ], {\n  constructor: function(id, name, age) {}\n});\n\nvar student = new Student(1, \"Rika\", 20);\nstudent.setOptions({ foo: true });               // student.opts === { foo: true }\nstudent.bind();                                  // true\nstudent.unbind();                                // false\n```\n\nOr after defining classes:\n\n``` javascript\nvar Student = Class(Person, {\n  constructor: function(id, name, age) {\n});\n\nextend(Student, [ Options, Events ]);\n```\n\nMixin with instance:\n\n``` javascript\nvar person = new Person(\"Rika\", 20);\n\nextend(person, Options);\nperson.setOptions({ foo: true });\n```\n Mixin with native classes:\n\n``` javascript\nextend(String.prototype, {\n  trim: function() {\n    return this.replace(/^\\s+|\\s+$/g, \"\");\n  }\n});\n\n\"   Hello World    \".trim();                     // \"Hello World\"\n```\n### No conflict\n\nIn browser environment, you might be using another library which also introduces the global namespace Class. JSFace can return the original Class back to the library claims it with a call to jsface.noConflict().\n\n``` javascript\njsface.noConflict();\n\n// Code that uses other library's Class can follow here\n// ...\n\n// Define classes by using jsface.Class directly\nvar Person = jsface.Class({\n});\n```\n\n## Plugins\n\n### Plug and Play pointcut\n\nJSFace supports Aspect Oriented Programming (AOP) via simple before/after mechanism. You can apply pointcuts over class constructors, class methods, singleton methods, instance methods. You can even apply pointcuts over native classes.\n\nAOP support is implemented as a standalone plugin.\n\n#### Setup\n\nBrowser:\n\n``` html\n<script src=\"jsface.pointcut.js\"></script>\n```\n\nthen in your code, make an alias to jsface.pointcut:\n\n``` javascript\nvar pointcut = jsface.pointcut;\n```\n\nNodeJS:\n\n``` javascript\nvar pointcut = require(\"jsface.pointcut\");\n```\n\n#### Applying pointcuts\n\nIn JSFace, an advisor is a set of pointcuts you want to apply to a subject. You can apply as many advisors as you want.\n\n``` javascript\nPerson = Class({\n  constructor: function(name) {\n    this.name    = name;\n    this.counter = 0;\n  },\n  foo: function(n) {\n  },\n  bar: function(n) {\n  }\n});\n\nvar advisor = {\n  constructor: {\n    before: function() {\n      this.age = 20;\n    },\n    after: function() {\n      this.email = \"rika@sample.com\";\n    }\n  },\n  foo: function(n) {                             // sugar syntax, foo:before\n    this.counter++;\n  },\n  bar: {\n    before: function(n) {\n      this.counter++;\n    },\n    after: function(n) {\n      this.counter++;\n    }\n  }\n};\n\nPerson = pointcut(Person, advisor);\n\nvar person = new Person(\"Rika\");\n\nperson.foo();\nperson.bar();\n\nperson.name    === \"Rika\";                       // true\nperson.age     === 20;                           // true\nperson.email   === \"rika@sample.com\";            // true\nperson.counter === 3;                            // true\n```\n\n#### Removing pointcuts\n\nUsing previous apply pointcut example:\n\n``` javascript\n// remove all pointcuts bound to constructor and foo\nPerson = poincut(Person, \"remove constructor foo\");\n\n// remove advisor, other advisors remained\nPerson = poincut(Person, \"remove\", advisor);\n\n// remove all advisors, restore the fresh version of Person\nPerson = poincut(Person, \"remove\");\n```\n\n### $ready\n\n$ready plugin is designed to help a parent class to intercept their subclasses' creation.\n\n#### Sample\n\n``` javascript\nvar Service = Class({\n  $ready: function(clazz, parent, api) {\n    var type = (this !== clazz) && api.type;     // (this !== clazz) means this comes from a sub-class\n\n    switch (type) {\n      case \"session\":\n        // do something with subclass clazz when its type is session\n        break;\n      case \"application\":\n        // do something with subclass clazz when its type is application\n        break;\n    }\n  }\n});\n\nvar SessionService = Class(Service, {\n  type: \"session\"\n});\n\nvar ApplicationService = Class(Service, {\n  type: \"application\"\n});\n```\n\n## Bug tracker\n\nHave a bug? Please [create an issue here](https://github.com/tannhu/jsface/issues) on GitHub!\n\n## License\n\nCopyright (c) Tan Nhu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","homepage":"https://github.com/tnhu/jsface","keywords":["jsface","JSFace","OOP","JavaScript OOP","JavaScript Object Oriented Programming","AOP","Aspect Oriented Programming"],"bugs":{"url":"https://github.com/tnhu/jsface/issues"},"readmeFilename":"README.md","users":{"mastayoda":true,"amobiz":true,"wyman2014":true}}