use base qw(Moo::Object);
use Sub::Defer;
use B 'perlstring';
+use Moo::_Utils qw(_getstash);
sub register_attribute_specs {
my ($self, @new_specs) = @_;
die "has '+${name}' given but no ${name} attribute already exists"
unless my $old_spec = $specs->{$name};
foreach my $key (keys %$old_spec) {
- $new_spec->{$key} = $old_spec->{$key}
- unless exists $new_spec->{$key};
+ if (!exists $new_spec->{$key}) {
+ $new_spec->{$key} = $old_spec->{$key}
+ unless $key eq 'handles';
+ }
+ elsif ($key eq 'moosify') {
+ $new_spec->{$key} = [
+ map { ref $_ eq 'ARRAY' ? @$_ : $_ }
+ ($old_spec->{$key}, $new_spec->{$key})
+ ];
+ }
}
}
$new_spec->{index} = scalar keys %$specs
sub construction_string {
my ($self) = @_;
$self->{construction_string}
- or 'bless('
- .$self->accessor_generator->default_construction_string
- .', $class);'
+ ||= $self->_build_construction_string;
+}
+
+sub _build_construction_string {
+ 'bless('
+ .$_[0]->accessor_generator->default_construction_string
+ .', $class);'
}
sub install_delayed {
my $source = "\$args->{$arg_key}";
my $attr_spec = $spec->{$_};
$self->_cap_call($ag->generate_populate_set(
- '$new', $_, $attr_spec, $source, $test
+ '$new', $_, $attr_spec, $source, $test, $test{$_},
));
} sort keys %test;
}
." }\n";
}
+use Moo;
+Moo->_constructor_maker_for(__PACKAGE__)->register_attribute_specs(
+ attribute_specs => {
+ is => 'ro',
+ reader => 'all_attribute_specs',
+ },
+ accessor_generator => { is => 'ro' },
+ construction_string => { is => 'lazy' },
+ subconstructor_handler => { is => 'ro' },
+ package => { is => 'ro' },
+);
+
1;