The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package NetHack::Logfile;
our $VERSION = '1.00';

use strict;
use warnings;
use Carp 'croak';
use NetHack::Logfile::Entry;

use Sub::Exporter -setup => {
    exports => [qw(read_logfile parse_logline write_logfile)],
};

sub read_logfile {
    my $filename = @_ ? shift : "logfile";
    my @entries;

    open my $handle, '<', $filename
        or croak "Unable to open $filename for reading: $!";

    while (<$handle>) {
        push @entries, parse_logline($_);
    }

    close $handle
        or croak "Unable to close $filename handle: $!";

    return @entries;
}

sub parse_logline { NetHack::Logfile::Entry->new_from_line(shift) }

sub write_logfile {
    my $entries  = shift;
    my $filename = shift || 'logfile';

    open my $handle, '>', $filename
        or croak "Unable to open $filename for writing: $!";

    for (@$entries) {
        print { $handle } $_->as_line . "\n";
    }

    close $handle
        or croak "Unable to close $filename handle: $!";

    return;
}

1;

__END__

=head1 NAME

NetHack::Logfile - Parse and create NetHack logfiles

=head1 VERSION

version 1.00

=head1 SYNOPSIS

    use NetHack::Logfile ':all';

    my @entries = read_logfile("logfile");
    @entries = sort { $b->score <=> $a->score } @entries;
    splice(@entries, 2000);
    write_logfile(\@entries, "high-scores");

    say $entries[0]->as_line;

=head1 DESCRIPTION

This module provides an easy way to read NetHack logfiles. You can also create
logfiles.

This module's interface changed drastically from C<0.01> to C<1.00>.

Currently, NetHack versions 3.2.0 through 3.4.3 are supported. If you desire
support for an older version, please open up a ticket on rt.cpan.org with some
logfile entries for these older versions.

=head1 FUNCTIONS

=head2 read_logfile

Takes a file (default name: F<logfile>) and parses it as a logfile. If any IO
error occurs in reading the file, an exception is thrown. If any error occurs
in parsing a logline, an exception is thrown.

This returns entries of class L<NetHack::Logfile::Entry>. See that module for
more information.

=head2 parse_logline

Shortcut for L<NetHack::Logfile::Entry/new_from_line>.

=head2 write_logfile

Takes an arrayref of L<NetHack::Logfile::Entry> objects and a filename (default
name: F<logfile>). If any IO error occurs, it will throw an exception.

Returns no useful value.

=head1 AUTHOR

Shawn M Moore, C<sartak@gmail.com>

=cut