underscore-source 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Source
3
- VERSION = "0.3.3"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -16,15 +16,20 @@
16
16
  // Save the previous value of the "_" variable.
17
17
  var previousUnderscore = root._;
18
18
 
19
- // Create a safe reference to the Underscore object for the functions below.
20
- var _ = root._ = {};
19
+ // If Underscore is called as a function, it returns a wrapped object that
20
+ // can be used OO-style. This wrapper holds altered versions of all the
21
+ // underscore functions. Wrapped objects may be chained.
22
+ var wrapper = function(obj) { this._wrapped = obj; };
23
+
24
+ // Create a safe reference to the Underscore object for reference below.
25
+ var _ = root._ = function(obj) { return new wrapper(obj); };
21
26
 
22
27
  // Export the Underscore object for CommonJS.
23
28
  if (typeof exports !== 'undefined') _ = exports;
24
29
 
25
30
  // Current version.
26
- _.VERSION = '0.3.3';
27
-
31
+ _.VERSION = '0.4.0';
32
+
28
33
  /*------------------------ Collection Functions: ---------------------------*/
29
34
 
30
35
  // The cornerstone, an each implementation.
@@ -442,11 +447,19 @@
442
447
 
443
448
  // Generate a unique integer id (unique within the entire client session).
444
449
  // Useful for temporary DOM ids.
450
+ var idCounter = 0;
445
451
  _.uniqueId = function(prefix) {
446
- var id = this._idCounter = (this._idCounter || 0) + 1;
452
+ var id = idCounter++;
447
453
  return prefix ? prefix + id : id;
448
454
  };
449
455
 
456
+ // Return a sorted list of the function names available in Underscore.
457
+ _.functions = function() {
458
+ var functions = [];
459
+ for (var key in _) if (Object.prototype.hasOwnProperty.call(_, key)) functions.push(key);
460
+ return _.without(functions, 'VERSION', 'prototype', 'noConflict').sort();
461
+ };
462
+
450
463
  // JavaScript templating a-la ERB, pilfered from John Resig's
451
464
  // "Secrets of the JavaScript Ninja", page 83.
452
465
  _.template = function(str, data) {
@@ -472,6 +485,29 @@
472
485
  _.foldr = _.reduceRight;
473
486
  _.filter = _.select;
474
487
  _.every = _.all;
475
- _.some = _.any;
488
+ _.some = _.any;
489
+ _.methods = _.functions;
490
+
491
+ /*------------------------ Setup the OOP Wrapper: --------------------------*/
492
+
493
+ // Add all of the Underscore functions to the wrapper object.
494
+ _.each(_.functions(), function(name) {
495
+ wrapper.prototype[name] = function() {
496
+ Array.prototype.unshift.call(arguments, this._wrapped);
497
+ var result = _[name].apply(_, arguments);
498
+ return this._chain ? _(result).chain() : result;
499
+ };
500
+ });
501
+
502
+ // Start chaining a wrapped Underscore object.
503
+ wrapper.prototype.chain = function() {
504
+ this._chain = true;
505
+ return this;
506
+ };
507
+
508
+ // Extracts the result from a wrapped and chained object.
509
+ wrapper.prototype.get = function() {
510
+ return this._wrapped;
511
+ };
476
512
 
477
513
  })();
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: underscore-source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.3
5
+ version: 0.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel X. Moore