The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Tie::Handle::CSV::Array;

use 5.006;
use strict;
use warnings;

use overload '""' => \&_stringify, fallback => 1;

sub _new
   {
   my ($class, $parent) = @_;
   my @self;
   tie(@self, $class, $parent);
   bless \@self, $class;
   }

sub TIEARRAY
   {
   my ($class, $parent) = @_;
   return bless
      {
      data   => [],
      csv_xs => *$parent->{opts}{csv_parser}
      },
      $class;
   }

sub CLEAR
   {
   my ($self) = @_;
   @{ $self->{'data'} } = ();
   }

sub EXTEND
   {
   my ($self, $count) = @_;
   }

sub STORE
   {
   my ($self, $index, $value) = @_;
   $self->{'data'}[$index] = $value;
   }

sub FETCHSIZE
   {
   my ($self) = @_;
   return scalar @{ $self->{'data'} };
   }

sub FETCH
   {
   my ($self, $index) = @_;
   return $self->{'data'}[$index];
   }

sub _stringify
   {
   my ($self)    = @_;
   my $under_tie = tied @{ $self };
   my @values    = @{ $under_tie->{'data'} };
   my $csv_xs    = $under_tie->{csv_xs};
   $csv_xs->combine(@values)
      || croak $$csv_xs->error_input();
   return $csv_xs->string();
   }

sub _init_store
   {
   my ($self, $values) = @_;
   my $under_tie = tied @{ $self };
   my $data = $under_tie->{data};
   @{ $data } = @{ $values };
   }

1;

__END__

=head1 NAME

Tie::Handle::CSV::Array - Support class for L<Tie::Handle::CSV>

=cut