package Mouse::Util;
use strict;
use warnings;
-use Exporter 'import';
+use base qw/Exporter/;
use Carp;
our @EXPORT_OK = qw(
# weaken
# other functions need to be loaded from our respective sources
- if (defined &Scalar::Util::openhandle || eval { require Scalar::Util; 1 }) {
+ if (defined &Scalar::Util::openhandle) {
*openhandle = \&Scalar::Util::openhandle;
} else {
# XXX - room for improvement
sub apply_all_roles {
my $meta = Mouse::Meta::Class->initialize(shift);
- my $role = shift;
- confess "Mouse::Util only supports 'apply_all_roles' on individual roles at a time" if @_;
- Mouse::load_class($role);
- $role->meta->apply($meta);
+ my @roles;
+ my $max = scalar(@_);
+ for (my $i = 0; $i < $max ; $i++) {
+ if ($i + 1 < $max && ref($_[$i + 1])) {
+ push @roles, [ $_[$i++] => $_[$i] ];
+ } else {
+ push @roles, [ $_[$i] => {} ];
+ }
+ }
+
+ foreach my $role_spec (@roles) {
+ Mouse::load_class( $role_spec->[0] );
+ }
+
+ ( $_->[0]->can('meta') && $_->[0]->meta->isa('Mouse::Meta::Role') )
+ || croak("You can only consume roles, "
+ . $_->[0]
+ . " is not a Moose role")
+ foreach @roles;
+
+ if ( scalar @roles == 1 ) {
+ my ( $role, $params ) = @{ $roles[0] };
+ $role->meta->apply( $meta, ( defined $params ? %$params : () ) );
+ }
+ else {
+ Mouse::Meta::Role->combine_apply($meta, @roles);
+ }
+
}
1;