extract :noecho and fallback into separate methods, require io/console