chromatic's ideas sound pretty solid.
The inheritance part should be pretty easy also.
Just modify the @ISA array. Maybe write a generic plugin
module to provide common routines. Then force the
plugins to inherit from the plugin module. So in a different
plugin type module do:
use plugin;
push(@ISA, "plugin");
That way routines will be looked for first in the local package then
they will be looked for in the packages named in @ISA. The plugin package
might provide routines to set the subroutine references etc.