Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
// Adds jQuery-style element collection methods to the return value of $$. // Freely distributable under the same terms as Prototype's license: // http://dev.rubyonrails.org/browser/spinoffs/prototype/trunk/LICENSE Object.blend = function(destination, source) { for (var key in source) if (Object.isUndefined(destination[key])) destination[key] = source[key]; return destination; }; Element.Collection = function(collection) { return Object.blend(collection.toArray(), Element.Collection.Methods); }; Element.addMethods = Element.addMethods.wrap(function(a) { (a = $A(arguments)).shift().apply(this, a); Element.Collection.Methods = Object.keys(Element.Methods).inject({ }, function(methods, key) { var value = Element.Methods[key]; if (Object.isFunction(value)) { methods[key] = value.wrap(function(proceed, args) { (args = $A(arguments)).shift(); return this.map(function(element) { return proceed.apply(element, [element].concat(args)); }); }); } return methods; }); }); Function.prototype.collectionize = function(constructor) { return this.wrap(function(proceed, a, collection) { if (Object.isArray(collection = (a = $A(arguments)).shift().apply(this, a))) return new constructor(collection); return collection; }); }; Element.addMethods(); $$ = $$.collectionize(Element.Collection);
This paste will be private.
From the Design Piracy series on my blog: