Object.extend(Event, (function(){
	return {
		// Delegates a single behavior to elements that
		// match the targetSelector
		delegate: function(element, eventName, targetSelector, handler) {
			var element = $(element);
			function createDelegation(_delegatedEvent) {
				var origin = _delegatedEvent.element();
				if ( origin.match(targetSelector) ){ return handler(_delegatedEvent); }
			};
			element.observe(eventName, createDelegation);
			return element;
		},
		
		// Delegates multiple behaviors for a single event name,
		// LowPro style.
		delegators: function(element, eventName, rules) {
			var element = $(element);
			function delegateRule(rule) {
				element.delegate(eventName, rule.key, rule.value);
			}
			$H(rules).each(delegateRule);
			return element;
		}
	};
})());

Element.addMethods({
	delegate: Event.delegate,
	delegators: Event.delegators
});

Object.extend(document, {
	delegate: Event.delegate,
	delegators: Event.delegators
});