There are some good thoughts on this in
Plugin based Perl app.
I recommend the first approach, mostly since I took it myself;
I use
Parse::RecDescent for the parsing, though keep an
eye out for its upcoming faster replacement. The rules parsed by
my grammar allow for external modules that I
require
on the fly.