Skip to content

Commit

Permalink
fix for conflict with Coffeescript #248
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewplummer committed Jan 9, 2013
1 parent 524872d commit e797c84
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ v1.3.8
- Performance improvement for loops.
- Fix for Array#sample sometimes returning undefined (Issue #252).
- Fix for French locales (Issue #249).
- Fix for conflict with Coffeescript (Issue #248).


v1.3.7
Expand Down
40 changes: 29 additions & 11 deletions lib/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,35 +61,42 @@
if(klass['SugarMethods']) return;
defineProperty(klass, 'SugarMethods', {});
extend(klass, false, false, {
'restore': function() {
var all = arguments.length === 0, methods = multiArgs(arguments);
iterateOverObject(klass['SugarMethods'], function(name, m) {
if(all || methods.indexOf(name) > -1) {
defineProperty(m.instance ? klass.prototype : klass, name, m.method);
}
});
},
'extend': function(methods, override, instance) {
extend(klass, instance !== false, override, methods);
},
'sugarRestore': function() {
return batchMethodExecute(klass, arguments, function(target, name, m) {
defineProperty(target, name, m.method);
});
},
'sugarRevert': function() {
return batchMethodExecute(klass, arguments, function(target, name, m) {
if(m.existed) {
defineProperty(target, name, m.original);
} else {
delete target[name];
}
});
}
});
}

// Class extending methods

function extend(klass, instance, override, methods) {
var extendee = instance ? klass.prototype : klass, original;
var extendee = instance ? klass.prototype : klass;
initializeClass(klass);
iterateOverObject(methods, function(name, method) {
original = extendee[name];
var original = extendee[name];
var existed = hasOwnProperty(extendee, name);
if(typeof override === 'function') {
method = wrapNative(extendee[name], method, override);
}
if(override !== false || !extendee[name]) {
defineProperty(extendee, name, method);
}
// If the method is internal to Sugar, then store a reference so it can be restored later.
klass['SugarMethods'][name] = { instance: instance, method: method, original: original };
klass['SugarMethods'][name] = { instance: instance, method: method, original: original, existed: existed };
});
}

Expand All @@ -102,6 +109,17 @@
extend(klass, instance, override, methods);
}

function batchMethodExecute(klass, args, fn) {
var all = args.length === 0, methods = multiArgs(args), changed = false;
iterateOverObject(klass['SugarMethods'], function(name, m) {
if(all || methods.indexOf(name) > -1) {
changed = true;
fn(m.instance ? klass.prototype : klass, name, m);
}
});
return changed;
}

function wrapNative(nativeFn, extendedFn, condition) {
return function() {
if(nativeFn && (condition === true || !condition.apply(this, arguments))) {
Expand Down
20 changes: 18 additions & 2 deletions unit_tests/environments/sugar/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -620,9 +620,22 @@ test('Object', function () {
equal('foo'.extended, undefined, 'Object.extended should not be mapped');
equal('foo'.equal, undefined, 'Object.equal should not be mapped (should be "equals" instead)');

restoreObjectPrototypeMethods();


// Issue #248
// Ensure that methods can be reverted

Object.sugarRevert('isObject');
equal('isObject' in {}, false, 'Object.sugarRevert | isObject should be removed');

Object.prototype.tap = undefined;
Object.extend();
Object.sugarRevert('tap');
equal('tap' in {}, true, 'Object.sugarRevert | previously undefined property should not be deleted');
equal(({}).tap === undefined, true, 'Object.sugarRevert | previously undefined property is still undefined');
delete Object.prototype.tap;

restoreObjectPrototypeMethods();


// Object.fromQueryString
Expand Down Expand Up @@ -745,7 +758,7 @@ test('Object', function () {

equal((69).chr(), 'F', 'Class.extend | should overwrite existing methods');

Number.restore('chr');
Number.sugarRestore('chr');

equal((69).chr(), 'E', 'Class.extend | simple array of strings should restore Sugar methods');
equal((1).plus(2, 3), 6, 'Class.extend | restoring Sugar methods should not override other custom extended methods');
Expand Down Expand Up @@ -857,5 +870,8 @@ test('Object', function () {

equal(Object.reject(obj2, 'moo').foo === obj, true, 'Object.reject | rejected values should be equal by reference');




});

0 comments on commit e797c84

Please sign in to comment.