X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMethod%2FGenerate%2FConstructor.pm;h=9dae34b53fc93da70a3b657b5b984274373befd6;hb=64284a1b21ce94c351f555f0e74929e4ff8ad323;hp=95cbe886756f6e8cb79a119c34eb0b1deaf3561f;hpb=faa9ce11cefee1e6f7800ec1dbe561717c162161;p=gitmo%2FMoo.git diff --git a/lib/Method/Generate/Constructor.pm b/lib/Method/Generate/Constructor.pm index 95cbe88..9dae34b 100644 --- a/lib/Method/Generate/Constructor.pm +++ b/lib/Method/Generate/Constructor.pm @@ -7,8 +7,13 @@ use Sub::Defer; use B 'perlstring'; sub register_attribute_specs { - my ($self, %spec) = @_; - @{$self->{attribute_specs}||={}}{keys %spec} = values %spec; + my ($self, @new_specs) = @_; + my $specs = $self->{attribute_specs}||={}; + while (my ($name, $new_spec) = splice @new_specs, 0, 2) { + $new_spec->{index} = scalar keys %$specs + unless defined $new_spec->{index}; + $specs->{$name} = $new_spec; + } $self; } @@ -22,7 +27,10 @@ sub accessor_generator { sub construction_string { my ($self) = @_; - $self->{construction_string} or 'bless({}, $class);' + $self->{construction_string} + or 'bless(' + .$self->accessor_generator->default_construction_string + .', $class);' } sub install_delayed { @@ -62,7 +70,7 @@ sub generate_method { } $body .= ' return $new;'."\n"; if ($into->can('DEMOLISH')) { - { local $@; require Method::Generate::DemolishAll; } + require Method::Generate::DemolishAll; Method::Generate::DemolishAll->new->generate_method($into); } quote_sub @@ -73,10 +81,9 @@ sub generate_method { sub _handle_subconstructor { my ($self, $into, $name) = @_; - if (my $gen = $self->{subconstructor_generator}) { + if (my $gen = $self->{subconstructor_handler}) { ' if ($class ne '.perlstring($into).') {'."\n". - ' '.$gen.";\n". - ' return $class->'.$name.'(@_)'.";\n". + $gen. ' }'."\n"; } else { '' @@ -91,7 +98,9 @@ sub _cap_call { sub _generate_args_via_buildargs { my ($self) = @_; - q{ my $args = $class->BUILDARGS(@_);}."\n"; + q{ my $args = $class->BUILDARGS(@_);}."\n" + .q{ die "BUILDARGS did not return a hashref" unless ref($args) eq 'HASH';} + ."\n"; } # inlined from Moo::Object - update that first. @@ -137,7 +146,7 @@ sub _assign_new { join '', ( @init ? ' '.$self->_cap_call($ag->generate_multi_set( - '$new', [ @slots ], '@{$args}{qw('.join(' ',@init).')}' + '$new', [ @slots ], '@{$args}{qw('.join(' ',@init).')}', $spec )).";\n" : '' ), map { @@ -196,7 +205,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";