Merge branch 'topic/more-compatible' of gitmo@moose.perl.org:Mouse into topic/more...
[gitmo/Mouse.git] / lib / Mouse / Meta / Attribute.pm
index 0312a56..8abdd14 100644 (file)
@@ -1,7 +1,6 @@
 package Mouse::Meta::Attribute;
 use strict;
 use warnings;
-require overload;
 
 use Carp 'confess';
 use Scalar::Util ();
@@ -222,13 +221,6 @@ sub create {
         if exists $args{coerce};
 
     if (exists $args{isa}) {
-        confess "Got isa => $args{isa}, but Mouse does not yet support parameterized types for containers other than ArrayRef and HashRef (rt.cpan.org #39795)"
-            if $args{isa} =~ /^([^\[]+)\[.+\]$/ &&
-               $1 ne 'ArrayRef' &&
-               $1 ne 'HashRef'  &&
-               $1 ne 'Maybe'
-        ;
-
         my $type_constraint = delete $args{isa};
         $args{type_constraint}= Mouse::Util::TypeConstraints::find_or_create_isa_type_constraint($type_constraint);
     }
@@ -239,10 +231,15 @@ sub create {
 
     $class->add_attribute($attribute);
 
+    my $associated_methods = 0;
+
+    my $is_metadata = $attribute->_is_metadata || '';
+
     # install an accessor
-    if ($attribute->_is_metadata eq 'rw' || $attribute->_is_metadata eq 'ro') {
+    if ($is_metadata eq 'rw' || $is_metadata eq 'ro') {
         my $code = $attribute->_generate_accessor();
         $class->add_method($name => $code);
+        $associated_methods++;
     }
 
     for my $method (qw/predicate clearer/) {
@@ -251,6 +248,7 @@ sub create {
             my $generator = "_generate_$method";
             my $coderef = $attribute->$generator;
             $class->add_method($attribute->$method => $coderef);
+            $associated_methods++;
         }
     }
 
@@ -258,9 +256,15 @@ sub create {
         my $method_map = $attribute->_generate_handles;
         for my $method_name (keys %$method_map) {
             $class->add_method($method_name => $method_map->{$method_name});
+            $associated_methods++;
         }
     }
 
+    if($associated_methods == 0 && $is_metadata ne 'bare'){
+        Carp::cluck(qq{Attribute ($name) of class }.$class->name.qq{ has no associated methods (did you mean to provide an "is" argument?)});
+
+    }
+
     return $attribute;
 }