package Acme::CPANAuthors::Utils::CPANIndex; use strict; use warnings; use Carp; sub new { my $class = shift; my $self = bless { preambles => {} }, $class; $self->_install_methods; $self->{$_} = {} for keys %{ $self->_mappings }; $self->_parse(@_) if @_; $self; } sub _mappings {+{}} sub _preambles {} sub _install_methods { my $self = shift; my $class = ref $self; no strict 'refs'; no warnings 'redefine'; for my $method ($self->_preambles) { *{"$class\::$method"} = sub { my $self = shift; $self->{preambles}{$method}; } } for my $method (keys %{ $self->_mappings }) { my $key = $self->_mappings->{$method}; *{"$class\::$method"} = sub { my ($self, $name) = @_; $self->{$key}{$name}; }; *{"$class\::${method}s"} = sub { my $self = shift; values %{ $self->{$key} }; }; *{"$class\::${method}_count"} = sub { my $self = shift; scalar values %{ $self->{$key} }; }; } } sub _handle { my ($self, $file) = @_; my $handle; if ($file =~ /\.gz$/) { require IO::Uncompress::Gunzip; $handle = IO::Uncompress::Gunzip->new($file) or croak "Failed to read $file"; } else { require IO::File; $handle = IO::File->new($file, 'r') or croak "Failed to read $file"; binmode $handle; } $handle; } 1; __END__ =head1 NAME Acme::CPANAuthors::Utils::CPANIndex =head1 SYNOPSIS =head1 DESCRIPTION =head1 METHODS =head2 new =head1 AUTHOR Kenichi Ishigaki, Eishigaki@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 by Kenichi Ishigaki. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut