         - Parameter message: message to be printed before accepting input (e.g. "Name: ")
         - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
     */
-    public class func awaitYesNoInput(message: String = "Confirm?") throws -> Bool {
-        return try awaitInputWithConversion(message: "\(message) [y/N]: ") {(input) in
+    public static func awaitYesNoInput(message: String = "Confirm?") -> Bool {
+        return awaitInputWithConversion(message: "\(message) [y/N]: ") {(input) in
             if input.lowercased() == "y" || input.lowercased() == "yes" {
                 return true
             } else if input.lowercased() == "n" || input.lowercased() == "no" {

        - Parameter validation: closure evaluating whether the given input was valid
        - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
    */
    public class func awaitInputWithValidation(message: String?, validation: (_ input: String) -> Bool) throws -> String {
        while (true) {
            let str = try awaitInput(message: message)
            
            if validation(str) {
                return str

        - Parameter conversion: closure attempting to convert the input to the desired output
        - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
    */
    public static func awaitInputWithConversion<T>(message: String?, conversion: (_ input: String) -> T?) -> T {
        let input = awaitInputWithValidation(message: message) { (input) in
            return conversion(input) != nil
        }
        
