X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FUtil.pm;h=09803d46a7050e33cc06702ba8383e451745573c;hb=cbbe07142fb297f06614b1ff7625e262b8c8d4cd;hp=fb2a409c439723a115a24963a100f46d7bd59524;hpb=18d77fc74297f8ee266e4e024b1f53c9f705aedc;p=gitmo%2FMoose.git diff --git a/lib/Moose/Util.pm b/lib/Moose/Util.pm index fb2a409..09803d4 100644 --- a/lib/Moose/Util.pm +++ b/lib/Moose/Util.pm @@ -3,6 +3,7 @@ package Moose::Util; 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; @@ -10,6 +11,7 @@ use Scalar::Util 'blessed'; use List::Util qw(first); use List::MoreUtils qw(any all); use overload (); +use Try::Tiny; use Class::MOP; my @exports = qw[ @@ -43,6 +45,10 @@ sub find_meta { Class::MOP::class_of(@_) } 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; @@ -117,7 +123,7 @@ sub _apply_all_roles { $meta = $role->[0]; } else { - Class::MOP::load_class( $role->[0] , $role->[1] ); + load_class( $role->[0] , $role->[1] ); $meta = find_meta( $role->[0] ); } @@ -137,7 +143,10 @@ sub _apply_all_roles { return unless @role_metas; - Class::MOP::load_class($applicant) unless blessed($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 ) { @@ -207,7 +216,7 @@ sub _build_alias_package_name { $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 ); @@ -299,12 +308,14 @@ sub meta_class_alias { # 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 { @@ -525,7 +536,7 @@ each of which can be followed by an optional hash reference of options =item B -This function is similar to L, but only applies roles that +This function is similar to C, but only applies roles that C<$applicant> does not already consume. =item B