use warnings;
use Sub::Exporter;
-use Scalar::Util ();
+use Scalar::Util 'blessed';
+use Carp 'confess';
use Class::MOP ();
-our $VERSION = '0.01';
+our $VERSION = '0.02';
our $AUTHORITY = 'cpan:STEVAN';
my @exports = qw[
find_meta
does_role
search_class_by_role
+ apply_all_roles
];
Sub::Exporter::setup_exporter({
exports => \@exports,
- groups => { default => \@exports }
+ groups => { all => \@exports }
});
## some utils for the utils ...
sub find_meta {
return unless $_[0];
- return Class::MOP::get_metaclass_by_name(ref($_[0]) || $_[0]);
+ return Class::MOP::get_metaclass_by_name(blessed($_[0]) || $_[0]);
}
## the functions ...
return;
}
+sub apply_all_roles {
+ my $applicant = shift;
+
+ confess "Must specify at least one role to apply to $applicant" unless @_;
+
+ my $roles = Data::OptList::mkopt([ @_ ]);
+
+ #use Data::Dumper;
+ #warn Dumper $roles;
+
+ my $meta = (blessed $applicant ? $applicant : find_meta($applicant));
+
+ Class::MOP::load_class($_->[0]) for @$roles;
+
+ ($_->[0]->can('meta') && $_->[0]->meta->isa('Moose::Meta::Role'))
+ || confess "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 {
+ Moose::Meta::Role->combine(
+ @$roles
+ )->apply($meta);
+ }
+}
+
+
1;
__END__
Returns first class in precedence list that consumed C<$role_name>.
+=item B<apply_all_roles ($applicant, @roles)>
+
+Given an C<$applicant> (which can somehow be turned into either a
+metaclass or a metarole) and a list of C<@roles> this will do the
+right thing to apply the C<@roles> to the C<$applicant>. This is
+actually used internally by both L<Moose> and L<Moose::Role>, and the
+C<@roles> will be pre-processed through L<Data::OptList::mkopt>
+to allow for the additional arguments to be passed.
+
=back
=head1 TODO
=head1 COPYRIGHT AND LICENSE
-Copyright 2007 by Infinity Interactive, Inc.
+Copyright 2007-2008 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>