 				var p:String = e.property.toString();
 				return Boolean(object[p] == object[p.replace('_confirmation', '')]);
 			});
+		}
+
+		/**
+		* validates_each('first_name', 'last_name', {
+		* 	message: 	'is invalid',
+		*	allow_nil:	false,
+		*	allow_blank:false,
+		* 	iff: 		function,
+		*	unless: 	function
+		* }, function (e:PropertyChangeEvent) :Boolean {
+		* 	return (e.newValue == 'Bob');
+		* })
+		**/
+		static public function each (object:Object, ...attr_names) :void
+		{
+			var validator:Function = (extract_options(attr_names) as Function);
+			var options:Hash = new Hash({ message: "{attr} is invalid" }).update(extract_options(attr_names));
+			add_validator(object, attr_names, options, validator);
 		}
 
 		/**

		static public function presence_of (object:Object, ...attr_names) :void
		{
			var options:Hash = new Hash({ message: "{attr} can't be blank" }).update(extract_options(attr_names));
			add_validator(object, attr_names, options, function (e:Object) :Boolean {
				return Boolean(e.newValue);
			});
		}


					// perform validation, create result object
					var result:ValidationResult;
					e.source = object;
					if (! validator(e))
					{
						// INVALID! stop ALL other validators NOW!
