/// <overloads>
		/// <param name="message">Message if the condition isn't met</param>
		/// </overloads>
		public static void Requires( bool condition, string name, string message )
		{
			Proclaim.NotEmpty( name );

			if( !condition )
			{
				throw new ArgumentException( message, name );
			}
		}
		/// <summary>
		/// Requires that a value not be <c>null</c>.
		/// </summary>
		/// <param name="value"></param>
		/// <param name="name"></param>
		/// <exception cref="ArgumentNullException">Value is <c>null</c>.</exception>
		public static void RequiresNotNull<T>( T value, string name ) where T : class
		{
			Proclaim.NotEmpty( name );

			if( value == null )
			{
				throw new ArgumentNullException( name );
			}
		}
		/// <overloads>
		/// <param name="name">Name of the requirement, this should be something unique to make it easy to find.</param>
		/// </overloads>
		public static void Requires( bool condition, string name )
		{
			Proclaim.NotEmpty( name );

			if( !condition )
			{
				throw new ArgumentException( "Invalid parameter value.", name );
			}
		}
		/// <summary>
		/// Requires the specified index to point inside the array or at the end.
		/// </summary>
		/// <exception cref="ArgumentNullException">Array is <c>null</c>.</exception>
		/// <exception cref="ArgumentOutOfRangeException">Index is outside the array.</exception>
		public static void RequiresArrayInsertIndex<T>( IList<T> array, int index, string indexName )
		{
			Proclaim.NotEmpty( indexName );
			Proclaim.NotNull( array );

			if( index < 0 || index > array.Count )
			{
				throw new ArgumentOutOfRangeException( indexName );
			}
		}
		/// <summary>
		/// Requires the array and all its items to be non-null.
		/// </summary>
		public static void RequiresNotNullItems<T>( IList<T> items, string name )
		{
			Proclaim.NotNull( name );
			RequiresNotNull( items, name );

			for( int i = 0; i < items.Count; i++ )
			{
				if( items[ i ] == null )
				{
					throw ExceptionFactory.CreateArgumentItemNullException( i, name );
				}
			}
		}
		/// <summary>
		/// Requires the range [offset, offset + count] to be a subset of [0, array.Count].
		/// </summary>
		/// <exception cref="ArgumentNullException">String is <c>null</c>.</exception>
		/// <exception cref="ArgumentOutOfRangeException">Offset or count are out of range.</exception>
		public static void RequiresArrayRange( string str, int offset, int count, string offsetName, string countName )
		{
			Proclaim.NotEmpty( offsetName );
			Proclaim.NotEmpty( countName );
			Proclaim.NotNull( str );

			if( count < 0 )
			{
				throw new ArgumentOutOfRangeException( countName );
			}
			if( offset < 0 || str.Length - offset < count )
			{
				throw new ArgumentOutOfRangeException( offsetName );
			}
		}
		/// <summary>
		/// Requires the range [offset, offset + count] to be a subset of [0, array.Count].
		/// </summary>
		/// <exception cref="ArgumentNullException">Array is <c>null</c>.</exception>
		/// <exception cref="ArgumentOutOfRangeException">Offset or count are out of range.</exception>
		public static void RequiresArrayRange<T>( IList<T> array, int offset, int count, string offsetName, string countName )
		{
			Proclaim.NotEmpty( offsetName );
			Proclaim.NotEmpty( countName );
			Proclaim.NotNull( array );

			if( count < 0 )
			{
				throw new ArgumentOutOfRangeException( countName );
			}
			if( offset < 0 || array.Count - offset < count )
			{
				throw new ArgumentOutOfRangeException( offsetName );
			}
		}