X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMethod%2FGenerate%2FConstructor.pm;h=080442b6f9ddc31f3b4a1fa3f0c44e54b4b2ea9c;hb=17c4135ad8cb1b78f2b4a28b8d953a9b1f6b5bfe;hp=d24a457e08c74a9de34b3a11265154328d2b80d3;hpb=02e9ef74cf0e746aad5bed3684661622017dad87;p=gitmo%2FMoo.git diff --git a/lib/Method/Generate/Constructor.pm b/lib/Method/Generate/Constructor.pm index d24a457..080442b 100644 --- a/lib/Method/Generate/Constructor.pm +++ b/lib/Method/Generate/Constructor.pm @@ -10,8 +10,16 @@ sub register_attribute_specs { my ($self, @new_specs) = @_; my $specs = $self->{attribute_specs}||={}; while (my ($name, $new_spec) = splice @new_specs, 0, 2) { + if ($name =~ s/^\+//) { + 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}; + } + } $new_spec->{index} = scalar keys %$specs - unless exists $new_spec->{index}; + unless defined $new_spec->{index}; $specs->{$name} = $new_spec; } $self; @@ -128,28 +136,15 @@ _EOA sub _assign_new { my ($self, $spec) = @_; - my (@init, @slots, %test); my $ag = $self->accessor_generator; + my %test; NAME: foreach my $name (sort keys %$spec) { my $attr_spec = $spec->{$name}; - unless ($ag->is_simple_attribute($name, $attr_spec)) { - next NAME unless defined($attr_spec->{init_arg}) - or $ag->has_eager_default($name, $attr_spec); - $test{$name} = $attr_spec->{init_arg}; - next NAME; - } - next NAME unless defined(my $i = $attr_spec->{init_arg}); - push @init, $i; - push @slots, $name; + next NAME unless defined($attr_spec->{init_arg}) + or $ag->has_eager_default($name, $attr_spec); + $test{$name} = $attr_spec->{init_arg}; } - return '' unless @init or %test; - join '', ( - @init - ? ' '.$self->_cap_call($ag->generate_multi_set( - '$new', [ @slots ], '@{$args}{qw('.join(' ',@init).')}' - )).";\n" - : '' - ), map { + join '', map { my $arg_key = perlstring($test{$_}); my $test = "exists \$args->{$arg_key}"; my $source = "\$args->{$arg_key}"; @@ -205,7 +200,7 @@ sub _fire_triggers { my ($init, $trigger) = @{$spec->{$name}}{qw(init_arg trigger)}; next unless $init && $trigger; my ($code, $add_captures) = $acc->generate_trigger( - $name, '$new', $acc->generate_simple_get('$new', $name), $trigger + $name, '$new', $acc->generate_simple_get('$new', $name, $spec), $trigger ); @{$captures}{keys %$add_captures} = values %$add_captures; $fire .= " ${code} if exists \$args->{${\perlstring $init}};\n";