 /**
- Validatable struct is used to indicate that a value can be validated.
- It requires no special attributes or conformance.
- 
- It's purpose is largely based on convenient code share and by
- conforming an object inherits a great deal of syntax to more 
- conveniently work with validators.
- 
- Naming Conventions
-
- - tested throws -> Self
- - passed -> Bool
- - validated throws -> Valid<Validator>
- 
- */
+    Validatable struct is used to indicate that a value can be validated.
+    It requires no special attributes or conformance.
+
+    It's purpose is largely based on convenient code share and by
+    conforming an object inherits a great deal of syntax to more 
+    conveniently work with validators.
+
+    Naming Conventions
+
+    - tested throws -> Self
+    - passed -> Bool
+    - validated throws -> Valid<Validator>
+*/
 public protocol Validatable {}
 
 // MARK: Conformance


extension Validatable {
    /**
     Validates a given value if possible

     - parameter validator: the validator to use in evaluating the value

     - throws: an error if validation fails

     - returns: a Valid<V> protecting a successfully validated value
     */
    public func validated<
        V: Validator
        where V.InputType == Self>(by validator: V)

    }

    /**
        Test whether or not the caller passes the given Validator

        - parameter validator: the validator to evaluate with

        - returns: whether or not the caller passed
    */
    public func passes<V: Validator where V.InputType == Self>(_ validator: V) -> Bool {
        return passes(validator.validate)
    }

    /**
        Test whether or not the caller passes the given ValidationSuite

        - parameter suite: the validation suite to evaluate with

        - returns: whether or not the caller passed
    */
    public func passes<S: ValidationSuite where S.InputType == Self>(_ suite: S.Type) -> Bool {
        return passes(suite.validate)
    }
