X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/8a635325ad558d18a2c6930a67e14f5312e91424..90af0ce7f2f0a8b4155d65a89e612bea1631db38:/SL/Helper/Csv/Dispatcher.pm diff --git a/SL/Helper/Csv/Dispatcher.pm b/SL/Helper/Csv/Dispatcher.pm index 3b6044342..31c5eba58 100644 --- a/SL/Helper/Csv/Dispatcher.pm +++ b/SL/Helper/Csv/Dispatcher.pm @@ -32,11 +32,24 @@ sub apply { return unless $value; for my $step (@{ $spec->{steps} }) { - my ($acc, $class) = @$step; + my ($acc, $class, $index) = @$step; if ($class) { + + # autovifify eval "require $class; 1" or die "could not load class '$class'"; - $obj->$acc($class->new) if ! $obj->$acc; - $obj = $obj->$acc; + if (defined $index) { + if (! $obj->$acc || !$obj->$acc->[$index]) { + my @objects = $obj->$acc; + $obj->$acc(@objects, map { $class->new } 0 .. $index - @objects); + } + $obj = $obj->$acc->[$index]; + } else { + if (! $obj->$acc) { + $obj->$acc($class->new); + } + $obj = $obj->$acc; + } + } else { $obj->$acc($value); } @@ -71,11 +84,12 @@ sub make_spec { my $spec = { key => $col, steps => [] }; my $cur_class = $self->_csv->class; - for my $step ( split /\./, $path ) { + for my $step_index ( split /\.(?!\d)/, $path ) { + my ($step, $index) = split /\./, $step_index; if ($cur_class->can($step)) { if ($cur_class->meta->relationship($step)) { #a my $next_class = $cur_class->meta->relationship($step)->class; - push @{ $spec->{steps} }, [ $step, $next_class ]; + push @{ $spec->{steps} }, [ $step, $next_class, $index ]; $cur_class = $next_class; } else { # simple dispatch push @{ $spec->{steps} }, [ $step ];