Since you're going pure Perl, please don't repeat the mistake of Module::Build of not having a dry-run and no trace of attempted/failed steps. make -n tells me in great detail what it will try, and make itself tells me what it tried and how it failed. Both are very necessary when debugging the installation.

Update: Another important addition are two hard rules for the Perl code:

No user interaction without defaults

No loops, or at least no possibly infinite loops when the installation is not run interactively

A good way for that might be specialized functions like prompt_path and prompt_executable, that implement the looping themselves.