summaryrefslogtreecommitdiff
path: root/node_modules/mongoose/lib/namedscope.js
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2012-09-24 16:22:07 -0400
committerJules Laplace <jules@okfoc.us>2012-09-24 16:22:07 -0400
commit686106d544ecc3b6ffd4db2b665d3bc879a58d8c (patch)
treea5b5e50237cef70e12f0745371896e96f5f6d578 /node_modules/mongoose/lib/namedscope.js
ok
Diffstat (limited to 'node_modules/mongoose/lib/namedscope.js')
-rw-r--r--node_modules/mongoose/lib/namedscope.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/node_modules/mongoose/lib/namedscope.js b/node_modules/mongoose/lib/namedscope.js
new file mode 100644
index 0000000..1b3f5d4
--- /dev/null
+++ b/node_modules/mongoose/lib/namedscope.js
@@ -0,0 +1,70 @@
+var Query = require('./query');
+function NamedScope () {}
+
+NamedScope.prototype.query;
+
+NamedScope.prototype.where = function () {
+ var q = this.query || (this.query = new Query());
+ q.where.apply(q, arguments);
+ return q;
+};
+
+/**
+ * Decorate
+ *
+ * @param {NamedScope} target
+ * @param {Object} getters
+ * @api private
+ */
+
+NamedScope.prototype.decorate = function (target, getters) {
+ var name = this.name
+ , block = this.block
+ , query = this.query;
+ if (block) {
+ if (block.length === 0) {
+ Object.defineProperty(target, name, {
+ get: getters.block0(block)
+ });
+ } else {
+ target[name] = getters.blockN(block);
+ }
+ } else {
+ Object.defineProperty(target, name, {
+ get: getters.basic(query)
+ });
+ }
+};
+
+NamedScope.prototype.compile = function (model) {
+ var allScopes = this.scopesByName
+ , scope;
+ for (var k in allScopes) {
+ scope = allScopes[k];
+ scope.decorate(model, {
+ block0: function (block) {
+ return function () {
+ var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this));
+ block.call(cquery);
+ return this;
+ };
+ },
+ blockN: function (block) {
+ return function () {
+ var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this));
+ block.apply(cquery, arguments);
+ return this;
+ };
+ },
+ basic: function (query) {
+ return function () {
+ var cquery = this._cumulativeQuery || (this._cumulativeQuery = new Query().bind(this));
+ cquery.find(query);
+ return this;
+ };
+ }
+ });
+ }
+};
+
+module.exports = NamedScope;