+ my $arg = {@_};
+ warn "### _get_marc_fields arg: ", dump($arg), $/ if ($debug > 2);
+ my $offset = $marc_fetch_offset;
+ if ($arg->{offset}) {
+ $offset = $arg->{offset};
+ } elsif($arg->{fetch_next}) {
+ $marc_fetch_offset++;
+ }
+
+ return if (! $marc_record || ref($marc_record) ne 'ARRAY');
+
+ warn "### full marc_record = ", dump( @{ $marc_record }), $/ if ($debug > 2);
+
+ my $marc_rec = $marc_record->[ $offset ];
+
+ warn "## _get_marc_fields (at offset: $offset) -- marc_record = ", dump( @$marc_rec ), $/ if ($debug > 1);
+
+ return if (! $marc_rec || ref($marc_rec) ne 'ARRAY' || $#{ $marc_rec } < 0);
+
+ # first, sort all existing fields
+ # XXX might not be needed, but modern perl might randomize elements in hash
+ my @sorted_marc_record = sort {
+ $a->[0] . ( $a->[3] || '' ) cmp $b->[0] . ( $b->[3] || '')
+ } @{ $marc_rec };
+
+ @sorted_marc_record = @{ $marc_rec }; ### FIXME disable sorting
+
+ # output marc fields
+ my @m;
+
+ # count unique field-subfields (used for offset when walking to next subfield)
+ my $u;
+ map { $u->{ $_->[0] . ( $_->[3] || '') }++ } @sorted_marc_record;
+
+ if ($debug) {
+ warn "## marc_repeatable_subfield = ", dump( $marc_repeatable_subfield ), $/ if ( $marc_repeatable_subfield );
+ warn "## marc_record[$offset] = ", dump( $marc_rec ), $/;
+ warn "## sorted_marc_record = ", dump( \@sorted_marc_record ), $/;
+ warn "## subfield count = ", dump( $u ), $/;
+ }
+
+ my $len = $#sorted_marc_record;
+ my $visited;
+ my $i = 0;
+ my $field;
+
+ foreach ( 0 .. $len ) {
+
+ # find next element which isn't visited
+ while ($visited->{$i}) {
+ $i = ($i + 1) % ($len + 1);