use strict;
use warnings;
+use Class::Load qw(load_class load_first_existing_class);
use Data::OptList;
use Params::Util qw( _STRING );
use Sub::Exporter;
use Scalar::Util 'blessed';
use List::Util qw(first);
use List::MoreUtils qw(any all);
-use Class::MOP 0.60;
-
-our $VERSION = '1.14';
-$VERSION = eval $VERSION;
-our $AUTHORITY = 'cpan:STEVAN';
+use overload ();
+use Try::Tiny;
+use Class::MOP;
my @exports = qw[
find_meta
sub does_role {
my ($class_or_obj, $role) = @_;
+ if (try { $class_or_obj->isa('Moose::Object') }) {
+ return $class_or_obj->does($role);
+ }
+
my $meta = find_meta($class_or_obj);
return unless defined $meta;
Moose->throw_error("Must specify at least one role to apply to $applicant");
}
- my $roles = Data::OptList::mkopt( [@_] );
+ # If @_ contains role meta objects, mkopt will think that they're values,
+ # because they're references. In other words (roleobj1, roleobj2,
+ # roleobj3) will become [ [ roleobj1, roleobj2 ], [ roleobj3, undef ] ]
+ # -- this is no good. We'll preprocess @_ first to eliminate the potential
+ # bug.
+ # -- rjbs, 2011-04-08
+ my $roles = Data::OptList::mkopt( [@_], {
+ moniker => 'role',
+ name_test => sub {
+ ! ref $_[0] or blessed($_[0]) && $_[0]->isa('Moose::Meta::Role')
+ }
+ });
my @role_metas;
foreach my $role (@$roles) {
$meta = $role->[0];
}
else {
- Class::MOP::load_class( $role->[0] , $role->[1] );
- $meta = Class::MOP::class_of( $role->[0] );
+ load_class( $role->[0] , $role->[1] );
+ $meta = find_meta( $role->[0] );
}
unless ($meta && $meta->isa('Moose::Meta::Role') ) {
return unless @role_metas;
- my $meta = ( blessed $applicant ? $applicant : find_meta($applicant) );
+ load_class($applicant)
+ unless blessed($applicant)
+ || Class::MOP::class_of($applicant);
+
+ my $meta = ( blessed $applicant ? $applicant : Moose::Meta::Class->initialize($applicant) );
if ( scalar @role_metas == 1 ) {
my ( $role, $params ) = @{ $role_metas[0] };
$type, $metaclass_name, $options{trait}
);
- my $loaded_class = Class::MOP::load_first_existing_class(
+ my $loaded_class = load_first_existing_class(
$possible_full_name,
$metaclass_name
);
}
# XXX - this should be added to Params::Util
-sub _STRINGLIKE ($) {
+sub _STRINGLIKE0 ($) {
return _STRING( $_[0] )
+ || ( defined $_[0]
+ && $_[0] eq q{} )
|| ( blessed $_[0]
&& overload::Method( $_[0], q{""} )
&& length "$_[0]" );
# handle the case where we need to fix compatibility between a class and
# its parent, but all roles in the class are already also done by the
# parent
- # see t/050/054.t
+ # see t/metaclasses/metaclass_compat_no_fixing_bug.t
return $super_meta_name
unless @role_differences;
sub _role_differences {
my ($class_meta_name, $super_meta_name) = @_;
- my @super_role_metas = $super_meta_name->meta->can('calculate_all_roles_with_inheritance')
- ? $super_meta_name->meta->calculate_all_roles_with_inheritance
- : $super_meta_name->meta->can('calculate_all_roles')
- ? $super_meta_name->meta->calculate_all_roles
- : ();
- my @role_metas = $class_meta_name->meta->can('calculate_all_roles_with_inheritance')
- ? $class_meta_name->meta->calculate_all_roles_with_inheritance
- : $class_meta_name->meta->can('calculate_all_roles')
- ? $class_meta_name->meta->calculate_all_roles
- : ();
+ my @super_role_metas
+ = grep { !$_->isa('Moose::Meta::Role::Composite') }
+ $super_meta_name->meta->can('calculate_all_roles_with_inheritance')
+ ? $super_meta_name->meta->calculate_all_roles_with_inheritance
+ : $super_meta_name->meta->can('calculate_all_roles')
+ ? $super_meta_name->meta->calculate_all_roles
+ : ();
+ my @role_metas
+ = grep { !$_->isa('Moose::Meta::Role::Composite') }
+ $class_meta_name->meta->can('calculate_all_roles_with_inheritance')
+ ? $class_meta_name->meta->calculate_all_roles_with_inheritance
+ : $class_meta_name->meta->can('calculate_all_roles')
+ ? $class_meta_name->meta->calculate_all_roles
+ : ();
my @differences;
for my $role_meta (@role_metas) {
push @differences, $role_meta
# (not inherited)
for my $method ( $meta->_get_local_methods ) {
# always ignore meta
- next if $method->name eq 'meta';
+ next if $method->isa('Class::MOP::Method::Meta');
# we'll deal with attributes below
next if $method->can('associated_attribute');
# if the method comes from a role we consumed, ignore it
1;
+# ABSTRACT: Utilities for working with Moose classes
+
__END__
=pod
-=head1 NAME
-
-Moose::Util - Utilities for working with Moose classes
-
=head1 SYNOPSIS
use Moose::Util qw/find_meta does_role search_class_by_role/;
See L<Moose/BUGS> for details on reporting bugs.
-=head1 AUTHOR
-
-Anders Nor Berle E<lt>debolaz@gmail.comE<gt>
-
-B<with contributions from:>
-
-Robert (phaylon) Sedlacek
-
-Stevan Little
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2007-2009 by Infinity Interactive, Inc.
-
-L<http://www.iinteractive.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
=cut