 			}
 		}
 		
-		protected function registerListener(listener:Function, priority:int):void
+		protected function registerListener(listener:Function, once:Boolean = false, priority:int = 0):void
 		{
 			// function.length is the number of arguments.
 			if (listener.length < _valueClasses.length)

			
			// If we made it this far, the new listener has lowest priority, so put it last.
			listenerBoxes[listenerBoxes.length] = listenerBox;
		}
		
	}

			if (!listenerBoxes.length)
			{
				listenerBoxes[0] = listenerBox;
				if (once) onceListeners[listener] = true;
				return;
			}
			
			var prevListenerIndex:int = indexOfListener(listener);
			if (prevListenerIndex >= 0)
			{
				// If the listener was previously added, definitely don't add it again.
				// But throw an exception in some cases, as the error messages explain.
				if (onceListeners[listener] && !once)
				{
					throw new IllegalOperationError('You cannot addOnce() then add() the same listener without removing the relationship first.');
				}
				else if (!onceListeners[listener] && once)
				{
					throw new IllegalOperationError('You cannot add() then addOnce() the same listener without removing the relationship first.');
				}
				// Listener was already added, so do nothing.
				return;
			}
			
			// Assume the listeners are already sorted by priority
			// and insert in the right spot. For listeners with the same priority,
