Why don't you simply differ between the script which does all the work and the GUI which executes the script?
So everyone could write his own GUI for which platform he wants to and even the console guys will be happy :)
package Lizard::King;
sub can { do { 'anything'} };