  */
 public struct Validator<T> {
 
-    var constraints = [ValidationConstraint<T>]()
+    var constraints:[ValidationConstraint<T>]
+    
+    /**
+     Create a new `Validator` instance
+     */
+    public init() {
+        constraints = [ValidationConstraint<T>]()
+    }
+    
+    /**
+     Create a new `Validator` instance populated with a predefined list of `ValidationConstraints`
+     
+     - parameter constraints: `[ValidationConstraint]`
+     */
+    public init(constraints:[ValidationConstraint<T>]) {
+        self.constraints = constraints
+    }
+
+    /**
+     Create a new `Validator` instance populated with a unsized list of `ValidationConstraints`
+     
+     - parameter constraints: `[ValidationConstraint]`
+     */
+    public init(constraints:ValidationConstraint<T>...) {
+        self.init(constraints:constraints)
+    }
 }
 
 extension Validator {

     - parameter input: The input to be validated.
     - returns: `.Valid` if the input is valid or a `.Invalid` containng the `ValiationError` of the failing `ValidationConstraint` otherwise.
     */
    public func validate(input:T?) -> ValidationResult {
        return constraints.reduce(.valid) { $0.isInvalid ? $0 : $1.evaluate(with: input) }
    }


     - parameter input: The input to be validated.
     - returns: An array of `ValidationResult` elements, indicating the evaluation result of each `ValidationConstraint` in collection.
     */
    public func evaluateAll(input:T?) -> [ValidationResult] {
        return constraints.map{ $0.evaluate(with:input) }
    }
}
