Moose compat: handles are not canonicalized in the meta attribute's storage, instead...
[gitmo/Mouse.git] / lib / Mouse / Attribute.pm
index dd4a7ae..115af44 100644 (file)
@@ -49,6 +49,7 @@ sub generate_accessor {
     my $trigger    = $attribute->trigger;
     my $type       = $attribute->type_constraint;
     my $constraint = $attribute->find_type_constraint;
+    my $builder    = $attribute->builder;
 
     my $accessor = 'sub {
         my $self = shift;';
@@ -77,13 +78,18 @@ sub generate_accessor {
         $accessor .= '}';
     }
     else {
+        $accessor .= 'confess "Cannot assign a value to a read-only accessor" if @_;';
     }
 
     if ($attribute->is_lazy) {
         $accessor .= '$self->{$key} = ';
-        $accessor .= ref($default) eq 'CODE'
-                   ? '$default->($self)'
-                   : '$default';
+
+        $accessor .= $attribute->has_builder
+                   ? '$self->$builder'
+                     : ref($default) eq 'CODE'
+                     ? '$default->($self)'
+                     : '$default';
+
         $accessor .= ' if !exists($self->{$key});';
     }
 
@@ -114,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;
@@ -134,19 +141,13 @@ sub generate_handles {
 sub create {
     my ($self, $class, $name, %args) = @_;
 
-    confess "You must specify a default for lazy attribute '$name'"
-        if $args{lazy} && !exists($args{default});
-
-    confess "Trigger is not allowed on read-only attribute '$name'"
-        if $args{trigger} && $args{is} ne 'rw';
+    confess "You cannot have lazy attribute ($name) without specifying a default value for it"
+        if $args{lazy} && !exists($args{default}) && !exists($args{builder});
 
     confess "References are not allowed as default values, you must wrap the default of '$name' in a CODE reference (ex: sub { [] } and not [])"
         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};