AnyData2

 view release on metacpan or  search on metacpan

lib/AnyData2/Format/CSV.pm  view on Meta::CPAN


  my $af = AnyData2->new(
    CSV              => {},
    "File::Linewise" => { filename => File::Spec->catfile( $test_dir, "simple.csv" ) }
  );

constructs a CSV accessor, passes all options down to C<csv_class> beside
C<csv_class>, C<csv_cols> and C<csv_skip_first_row>. C<csv_class> is used
to instantiate the parser and prefers L<Text::CSV_XS> over L<Text::CSV>
by default.  When C<csv_skip_first_row> is set to a true value, the first
line of the csv isn't used to guess the names in C<csv_cols>. Specifying
C<csv_cols> always wins over any value of C<csv_skip_first_row>.

=cut

sub new
{
    my ( $class, $storage, %options ) = @_;
    my $self = $class->SUPER::new($storage);

    my $csv_class          = delete $options{csv_class};
    my $csv_skip_first_row = delete $options{csv_skip_first_row};

    defined $csv_class or $csv_class = $class->_guess_suitable_class(qw(Text::CSV_XS Text::CSV));

    my $csv = $csv_class->new( {%options} );
    $self->{csv} = $csv;

    # XXX
    $self->cols unless ( defined $csv_skip_first_row and $csv_skip_first_row );

    $self;
}

lib/AnyData2/Role/GuessImplementation.pm  view on Meta::CPAN

package AnyData2::Role::GuessImplementation;

use 5.008001;
use strict;
use warnings FATAL => 'all';

use base "Exporter";
our @EXPORT = "_guess_suitable_class";

use Carp qw/croak/;
use List::MoreUtils qw(firstval);
use Module::Runtime qw(require_module);

=head1 NAME

AnyData2::Role::GuessImplementation - provides role for guessing suitable implementation

=cut

our $VERSION = '0.002';

=head1 METHODS

=head2 _guess_suitable_class(@suitables)

Finds first suitable class from C<@suitables>. Results are cached.

=cut

my %suitable_classes;

sub _guess_suitable_class
{
    my ( $class, @classlist ) = @_;
    $suitable_classes{$class} or $suitable_classes{$class} = firstval
    {
        eval { require_module($_); }
    }
    @classlist;
    $suitable_classes{$class} or croak( "No suitable class out of (" . join( ", ", @classlist ) . ")for $class available" );
    $suitable_classes{$class};
}



( run in 1.068 second using v1.01-cache-2.11-cpan-702932259ff )