use overload::StrVal in type-constraint errors
[gitmo/Mouse.git] / lib / Mouse / Attribute.pm
index c086b40..a2569d4 100644 (file)
@@ -26,7 +26,7 @@ sub is_lazy         { $_[0]->{lazy}            }
 sub predicate       { $_[0]->{predicate}       }
 sub clearer         { $_[0]->{clearer}         }
 sub handles         { $_[0]->{handles}         }
-sub weak_ref        { $_[0]->{weak_ref}        }
+sub is_weak_ref     { $_[0]->{weak_ref}        }
 sub init_arg        { $_[0]->{init_arg}        }
 sub type_constraint { $_[0]->{type_constraint} }
 sub trigger         { $_[0]->{trigger}         }
@@ -44,7 +44,7 @@ sub generate_accessor {
     my $attribute = shift;
 
     my $name       = $attribute->name;
-    my $key        = $attribute->init_arg;
+    my $key        = $name;
     my $default    = $attribute->default;
     my $trigger    = $attribute->trigger;
     my $type       = $attribute->type_constraint;
@@ -60,15 +60,15 @@ sub generate_accessor {
 
         if ($constraint) {
             $accessor .= 'do {
-                my $display = defined($_) ? $_ : "undef";
+                my $display = defined($_) ? overload::StrVal($_) : "undef";
                 Carp::confess("Attribute ($name) does not pass the type constraint because: Validation failed for \'$type\' failed with value $display") unless $constraint->();
             };'
         }
 
         $accessor .= '$self->{$key} = $_;';
 
-        if ($attribute->weak_ref) {
-            $accessor .= 'Scalar::Util::weaken($self->{$key});';
+        if ($attribute->is_weak_ref) {
+            $accessor .= 'Scalar::Util::weaken($self->{$key}) if ref($self->{$key});';
         }
 
         if ($trigger) {
@@ -101,7 +101,7 @@ sub generate_accessor {
 
 sub generate_predicate {
     my $attribute = shift;
-    my $key = $attribute->init_arg;
+    my $key = $attribute->name;
 
     my $predicate = 'sub { exists($_[0]->{$key}) }';
 
@@ -110,7 +110,7 @@ sub generate_predicate {
 
 sub generate_clearer {
     my $attribute = shift;
-    my $key = $attribute->init_arg;
+    my $key = $attribute->name;
 
     my $predicate = 'sub { delete($_[0]->{$key}) }';
 
@@ -120,11 +120,12 @@ sub generate_clearer {
 sub generate_handles {
     my $attribute = shift;
     my $reader = $attribute->name;
+    my %handles = $attribute->_canonicalize_handles($attribute->handles);
 
     my %method_map;
 
-    for my $local_method (keys %{ $attribute->handles }) {
-        my $remote_method = $attribute->handles->{$local_method};
+    for my $local_method (keys %handles) {
+        my $remote_method = $handles{$local_method};
 
         my $method = 'sub {
             my $self = shift;
@@ -147,9 +148,6 @@ sub create {
         if ref($args{default})
         && ref($args{default}) ne 'CODE';
 
-    $args{handles} = { $self->_canonicalize_handles($args{handles}) }
-        if $args{handles};
-
     $args{type_constraint} = delete $args{isa}
         if exists $args{isa};
 
@@ -271,7 +269,7 @@ installed. Some error checking is done.
 
 =head2 has_handles -> Bool
 
-=head2 weak_ref -> Bool
+=head2 is_weak_ref -> Bool
 
 =head2 init_arg -> Str