     /**
         Awaits a string of input
         - 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 static func awaitInput(message: String?) -> String {
         if let message = message {

        Awaits a string of convertible input; continues accepting input until the given input is successfully converted
        - Parameter message: message to be printed before accepting input (e.g. "Name: ")
        - 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

    /**
        Awaits yes/no input; "y" and "yes" are accepted as yes and "n" and "no" are accepted as no (case insensitive)
        - Parameter message: message to be printed before accepting input (e.g. "Name: ")
    */
    public static func awaitYesNoInput(message: String = "Confirm?") -> Bool {
        return awaitInputWithConversion(message: "\(message) [y/N]: ") {(input) in
