Mouse::Util::does_role() respects $thing->does() method
[gitmo/Mouse.git] / lib / Mouse / Util.pm
index eeee3f3..17d7efe 100644 (file)
@@ -50,7 +50,7 @@ BEGIN{
         },
     );
 
-    our $VERSION = '0.89';
+    our $VERSION = '0.95';
 
     my $xs = !(defined(&is_valid_class_name) || $ENV{MOUSE_PUREPERL} || $ENV{PERL_ONLY});
 
@@ -80,7 +80,8 @@ BEGIN{
 
     # definition of mro::get_linear_isa()
     my $get_linear_isa;
-    if (eval { require mro }) {
+    if ($] >= 5.010_000) {
+        require mro;
         $get_linear_isa = \&mro::get_linear_isa;
     }
     else {
@@ -168,7 +169,7 @@ sub find_meta{
     return class_of( $_[0] );
 }
 
-sub does_role{
+sub _does_role_impl {
     my ($class_or_obj, $role_name) = @_;
 
     my $meta = class_of($class_or_obj);
@@ -179,6 +180,16 @@ sub does_role{
     return defined($meta) && $meta->does_role($role_name);
 }
 
+sub does_role {
+    my($thing, $role_name) = @_;
+
+    if( (Scalar::Util::blessed($thing) || is_class_loaded($thing))
+            && $thing->can('does')) {
+        return $thing->does($role_name);
+    }
+    goto &_does_role_impl;
+}
+
 # taken from Mouse::Util (0.90)
 {
     my %cache;
@@ -376,7 +387,7 @@ sub dump :method {
 
 # general does() method
 sub does :method {
-    goto &does_role;
+    goto &_does_role_impl;
 }
 
 1;
@@ -388,7 +399,7 @@ Mouse::Util - Utilities for working with Mouse classes
 
 =head1 VERSION
 
-This document describes Mouse version 0.89
+This document describes Mouse version 0.95
 
 =head1 SYNOPSIS