]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Helper/Csv/Dispatcher.pm
Multiple Dispatch - one-to-many.
[mfinanz.git] / SL / Helper / Csv / Dispatcher.pm
index 3b6044342385da57d4c38e38af57a2e07fbd1dd5..31c5eba587b66fc585dcfb7a29d74a32b4c67c33 100644 (file)
@@ -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 ];