I use a similar technique for a very simple plugin system. The main object is a Moose object, and all of the plugins are Moose roles. With in the main class (call it MyApp), I have a method:
sub create_with_roles
{
my ($class, $roles, %args) = @_;
for my $role (@$roles)
{
next if $role =~ /::/;
$role = 'MyApp::Role::' . $role;
}
Moose::Util::ensure_all_roles( $class, @$roles );
return $class->new( %args );
}
... and within the drive program, I can write:
my $app = MyApp->create_with_roles(
[qw( List Of Role Names )],
%constructor_arguments
);
... and get back an object which is an instance of MyApp which performs all of the named roles. It's been working very well.