sorry_Debolaz
Stevan Little [Tue, 31 Jul 2007 21:19:06 +0000 (21:19 +0000)]
Changes
lib/Moose/Meta/Attribute.pm
t/071_misc_attribute_tests.t

diff --git a/Changes b/Changes
index 717ae97..7c6622c 100644 (file)
--- a/Changes
+++ b/Changes
@@ -5,6 +5,9 @@ Revision history for Perl extension Moose
       - required attributes now will no longer accept undef 
         from the constructor, even if there is a default and lazy
         - added tests for this
+      - default subroutines must return a value which passes the 
+        type constraint
+        - added tests for this
 
     * Moose::Meta::Role
       - massive refactoring of this code
index 7bd0bbe..c6e4abf 100644 (file)
@@ -226,7 +226,7 @@ sub initialize_instance_slot {
         $val = $self->default($instance); 
     }   
     
-       if (defined $val) {
+       if (defined $val || $self->has_default) {
            if ($self->has_type_constraint) {
                my $type_constraint = $self->type_constraint;
                    if ($self->should_coerce && $type_constraint->has_coercion) {
@@ -237,7 +237,7 @@ sub initialize_instance_slot {
                            $self->name . 
                            ") does not pass the type constraint (" . 
                            $type_constraint->name .
-                           ") with '$val'";                    
+                           ") with '" . (defined $val ? $val : 'undef') . "'";                 
         }
        }
 
index bdab707..808e646 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 8;
+use Test::More tests => 9;
 use Test::Exception;
 
 BEGIN {
@@ -84,3 +84,23 @@ BEGIN {
     can_ok($test, qw(foo bar baz));
     
 }
+
+{
+    {
+        package Test::UndefDefault::Attributes;
+        use Moose;
+
+        has 'foo' => (
+            is      => 'ro',
+            isa     => 'Str',
+            default => sub { return }
+        );
+        
+    }
+
+    dies_ok {
+        Test::UndefDefault::Attributes->new;
+    } '... default must return a value which passes the type constraint';
+    
+}
+