use strict;
use warnings;
+use Class::Load 0.07 qw(load_class load_first_existing_class);
use Data::OptList;
use Params::Util qw( _STRING );
use Sub::Exporter;
use List::Util qw(first);
use List::MoreUtils qw(any all);
use overload ();
+use Try::Tiny;
use Class::MOP;
my @exports = qw[
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;
$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 _STRINGLIKE0 ($) {
- return _STRING( $_[0] )
- || ( defined $_[0]
- && $_[0] eq q{} )
- || ( blessed $_[0]
- && overload::Method( $_[0], q{""} )
- && length "$_[0]" );
+ return 1 if _STRING( $_[0] );
+ if ( blessed $_[0] ) {
+ return overload::Method( $_[0], q{""} );
+ }
+
+ return 1 if defined $_[0] && $_[0] eq q{};
+
+ return 0;
}
sub _reconcile_roles_for_metaclass {
=item B<ensure_all_roles($applicant, @roles)>
-This function is similar to L</apply_all_roles>, but only applies roles that
+This function is similar to C<apply_all_roles>, but only applies roles that
C<$applicant> does not already consume.
=item B<with_traits($class_name, @role_names)>