use warnings;
use MRO::Compat;
-use Scalar::Util 'blessed';
+use Scalar::Util qw/blessed weaken/;
use Carp 'confess';
sub new {
my $default;
if (!exists($args{$key})) {
- if (exists($attribute->{default}) || exists($attribute->{builder})) {
- unless ($attribute->{lazy}) {
- my $builder = $attribute->{builder};
- my $default = exists($attribute->{builder})
- ? $instance->$builder
- : ref($attribute->{default}) eq 'CODE'
- ? $attribute->{default}->()
- : $attribute->{default};
-
- $attribute->verify_type_constraint($default)
+ if ($attribute->has_default || $attribute->has_builder) {
+ my $default = $attribute->default;
+
+ unless ($attribute->is_lazy) {
+ my $builder = $attribute->builder;
+ my $value = $attribute->has_builder
+ ? $instance->$builder
+ : ref($default) eq 'CODE'
+ ? $default->()
+ : $default;
+
+ $attribute->verify_type_constraint($value)
if $attribute->has_type_constraint;
- $instance->{$key} = $default;
+ $instance->{$key} = $value;
- Scalar::Util::weaken($instance->{$key})
- if $attribute->{weak_ref};
+ weaken($instance->{$key})
+ if $attribute->weak_ref;
}
}
else {
- if ($attribute->{required}) {
- confess "Attribute '$attribute->{name}' is required";
+ if ($attribute->is_required) {
+ confess "Attribute '".$attribute->name."' is required";
}
}
}
$instance->{$key} = $args{$key};
- Scalar::Util::weaken($instance->{$key})
- if $attribute->{weak_ref};
+ weaken($instance->{$key})
+ if $attribute->weak_ref;
- if ($attribute->{trigger}) {
- $attribute->{trigger}->($instance, $args{$key}, $attribute);
+ if ($attribute->has_trigger) {
+ $attribute->trigger->($instance, $args{$key}, $attribute);
}
}
}