my ( $proto, $plugin, $instant ) = @_;
my $class = ref $proto || $proto;
- # no ignore_loaded here, the plugin may already have been
- # defined in memory and we don't want to error on "no file" if so
-
Class::MOP::load_class( $plugin );
$proto->_plugins->{$plugin} = 1;
$class->_plugins( {} ) unless $class->_plugins;
$plugins ||= [];
- for my $plugin ( reverse @$plugins ) {
- unless ( $plugin =~ s/\A\+// ) {
- $plugin = "Catalyst::Plugin::$plugin";
- }
+ my @plugins = map { s/\A\+// ? $_ : "Catalyst::Plugin::$_" } @$plugins;
+
+ Class::MOP::load_class($_) for @plugins;
+
+ for my $plugin ( reverse @plugins ) {
+ my $meta = find_meta($plugin);
+ next if $meta && $meta->isa('Moose::Meta::Role');
$class->_register_plugin($plugin);
}
+
+ my @roles =
+ map { $_->name }
+ grep { $_ && blessed($_) && $_->isa('Moose::Meta::Role') }
+ map { find_meta($_) }
+ @plugins;
+
+ Moose::Util::apply_all_roles(
+ $class => @roles
+ ) if @roles;
}
}
--- /dev/null
+use strict;
+use warnings;
+
+use FindBin qw/$Bin/;
+use lib "$Bin/../lib";
+
+use Test::More tests => 2;
+
+use TestApp;
+use TestApp::Role;
+
+is $TestApp::Role::SETUP_FINALIZE, 1, 'TestApp->setup_finalize modifier run once';
+is $TestApp::Role::SETUP_DISPATCHER, 1, 'TestApp->setup_dispacter modifier run once';
+
--- /dev/null
+package TestApp::Role;
+use Moose::Role;
+use namespace::clean -except => 'meta';
+
+requires 'fully_qualified'; # Comes from TestApp::Plugin::FullyQualified
+
+our $SETUP_FINALIZE = 0;
+our $SETUP_DISPATCHER = 0;
+
+before 'setup_finalize' => sub { $SETUP_FINALIZE++ };
+
+before 'setup_dispatcher' => sub { $SETUP_DISPATCHER++ };
+
+1;
+