=head1 Public Methods
+=head2 load_plugins @plugins
+
=head2 load_plugin $plugin
Load the apropriate role for C<$plugin> as well as any extensions it provides
=cut
-sub load_plugin{
- my ($self, $plugin) = @_;
- die("You must provide a plugin name") unless $plugin;
+sub load_plugins {
+ my ($self, @plugins) = @_;
+ die("You must provide a plugin name") unless @plugins;
my $loaded = $self->_plugin_loaded;
- return 1 if exists $loaded->{$plugin};
-
- my $role = $self->_role_from_plugin($plugin);
- $loaded->{$plugin} = $role if $self->_load_and_apply_role($role);
- $self->load_plugin_ext($plugin) if $self->_plugin_ext;
+ my @load = grep { not exists $loaded->{$_} } @plugins;
- return exists $loaded->{$plugin};
-}
+ my @roles = map { $self->_role_from_plugin($_) } @load;
-=head2 load_plugins @plugins
+ if ( $self->_load_and_apply_role(@roles) ) {
+ @{ $loaded }{@load} = @roles;
-Load all C<@plugins>.
+ if ( $self->_plugin_ext ) {
+ $self->load_plugin_ext($_) for @load;
+ }
-=cut
+ return 1;
+ } else {
+ return;
+ }
+}
-sub load_plugins {
+sub load_plugin {
my $self = shift;
- $self->load_plugin($_) for @_;
+ $self->load_plugins(@_);
}
return shift @roles;
}
-=head2 _load_and_apply_role $role
+=head2 _load_and_apply_role @roles
Require C<$role> if it is not already loaded and apply it. This is
the meat of this module.
=cut
sub _load_and_apply_role{
- my ($self, $role) = @_;
- die("You must provide a role name") unless $role;
+ my ($self, @roles) = @_;
+ die("You must provide a role name") unless @roles;
- eval { Class::MOP::load_class($role) };
- confess("Failed to load role: ${role} $@") if $@;
+ foreach my $role ( @roles ) {
+ eval { Class::MOP::load_class($role) };
+ confess("Failed to load role: ${role} $@") if $@;
- carp("Using 'override' is strongly discouraged and may not behave ".
- "as you expect it to. Please use 'around'")
+ carp("Using 'override' is strongly discouraged and may not behave ".
+ "as you expect it to. Please use 'around'")
if scalar keys %{ $role->meta->get_override_method_modifiers_map };
+ }
+
+ Moose::Util::apply_all_roles( $self, @roles );
- $role->meta->apply( $self );
return 1;
}