def ask( question, answer_type = String, &details )
@question ||= Question.new(question, answer_type, &details)
return gather if @question.gather
say(@question) unless (@question.readline and @question.echo == true)
begin
@answer = @question.answer_or_default(get_response)
unless @question.valid_answer?(@answer)
explain_error(:not_valid)
raise QuestionError
end
@answer = @question.convert(@answer)
if @question.in_range?(@answer)
if @question.confirm
context_change = self.class.new(@input, @output, @wrap_at, @page_at)
if @question.confirm == true
confirm_question = "Are you sure? "
else
template = ERB.new(@question.confirm, nil, "%")
confirm_question = template.result(binding)
end
unless context_change.agree(confirm_question)
explain_error(nil)
raise QuestionError
end
end
@answer
else
explain_error(:not_in_range)
raise QuestionError
end
rescue QuestionError
retry
rescue ArgumentError
explain_error(:invalid_type)
retry
rescue Question::NoAutoCompleteMatch
explain_error(:no_completion)
retry
rescue NameError
raise if $!.is_a?(NoMethodError)
explain_error(:ambiguous_completion)
retry
ensure
@question = nil
end
end