bless \%args, $class;
}
-sub name { $_[0]->{name} }
-sub class { $_[0]->{class} }
-sub _is_metadata { $_[0]->{is} }
-sub is_required { $_[0]->{required} }
-sub default { $_[0]->{default} }
-sub is_lazy { $_[0]->{lazy} }
-sub predicate { $_[0]->{predicate} }
-sub clearer { $_[0]->{clearer} }
-sub handles { $_[0]->{handles} }
-sub is_weak_ref { $_[0]->{weak_ref} }
-sub init_arg { $_[0]->{init_arg} }
-sub type_constraint { $_[0]->{type_constraint} }
-sub trigger { $_[0]->{trigger} }
-sub builder { $_[0]->{builder} }
+sub name { $_[0]->{name} }
+sub class { $_[0]->{class} }
+sub _is_metadata { $_[0]->{is} }
+sub is_required { $_[0]->{required} }
+sub default { $_[0]->{default} }
+sub is_lazy { $_[0]->{lazy} }
+sub predicate { $_[0]->{predicate} }
+sub clearer { $_[0]->{clearer} }
+sub handles { $_[0]->{handles} }
+sub is_weak_ref { $_[0]->{weak_ref} }
+sub init_arg { $_[0]->{init_arg} }
+sub type_constraint { $_[0]->{type_constraint} }
+sub trigger { $_[0]->{trigger} }
+sub builder { $_[0]->{builder} }
+sub should_auto_deref { $_[0]->{auto_deref} }
sub has_default { exists $_[0]->{default} }
sub has_predicate { exists $_[0]->{predicate} }
$accessor .= ' if !exists($self->{$key});';
}
- $accessor .= 'return $self->{$key}
+ if ($attribute->should_auto_deref) {
+ if ($attribute->type_constraint eq 'ArrayRef') {
+ $accessor .= 'if (wantarray) {
+ return @{ $self->{$key} || [] };
+ }';
+ }
+ else {
+ $accessor .= 'if (wantarray) {
+ return %{ $self->{$key} || {} };
+ }';
+ }
+ }
+
+ $accessor .= 'return $self->{$key};
}';
return eval $accessor;
sub create {
my ($self, $class, $name, %args) = @_;
- 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';
+ $self->validate_args($name, %args);
$args{type_constraint} = delete $args{isa}
if exists $args{isa};
return $attribute;
}
+sub validate_args {
+ my $self = shift;
+ my $name = shift;
+ my %args = @_;
+
+ 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';
+
+ confess "You cannot auto-dereference without specifying a type constraint on attribute $name"
+ if $args{auto_deref} && !exists($args{isa});
+
+ confess "You cannot auto-dereference anything other than a ArrayRef or HashRef on attribute $name"
+ if $args{auto_deref}
+ && $args{isa} ne 'ArrayRef'
+ && $args{isa} ne 'HashRef';
+
+ return 1;
+}
+
sub find_type_constraint {
my $self = shift;
my $type = $self->type_constraint;
=head2 has_builder -> Bool
+=head2 should_auto_deref -> Bool
+
Informational methods.
=head2 generate_accessor -> CODE