The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Term::TtyRec::Player;

use strict;
use vars qw($VERSION);
$VERSION = '0.03';

use Time::HiRes qw(sleep);
use Term::TtyRec;

sub new {
    my($proto, $io, $attr) = @_;
    my $class = ref $proto || $proto;
    my %attr = ( speed => 1, nowait => undef, %{$attr || {}} ); # default

    unless ($io->can('read')) {
	require Carp;
	Carp::croak('Usage: Term::TtyRec::Player->new($io)');
    }

    bless { ttyrec => Term::TtyRec->new($io), %attr }, $class;
}

sub play {
    my $self = shift;
    local $| = 1;

    my $prev;
    while (my($sec, $text) = $self->ttyrec->read_next) {
	my $wait = ($sec - $prev) / $self->speed if defined $prev;
	unless ($self->nowait or ! $prev) {
	    sleep $wait;
	}
	print $text;
	$prev = $sec;
    }
}

sub skip_all {
    my $self = shift;
    1 while $self->ttyrec->read_next;
}

sub peek {
    my $self = shift;
    $self->skip_all;

    while (1) {
	$self->play;
	sleep 0.25;
    }
}

### accessor
for my $attr (qw(ttyrec speed nowait)) {
    no strict 'refs';
    *{__PACKAGE__. "::$attr"} = sub {
	my $self = shift;
	$self->{$attr} = shift if @_;
	$self->{$attr};
    };
}


1;
__END__

=head1 NAME

Term::TtyRec::Player - playbacks ttyrec data

=head1 SYNOPSIS

  use Term::TtyRec::Player;
  use FileHandle;

  # $handle is any IO::* object
  my $handle = FileHandle->new('file.tty');
  my $player = Term::TtyRec::Player->new($handle);

  # options can be set as hashref
  my $player = Term::TtyRec::Player->new($handle, {
      speed => 1, nowait => undef,
  });

=head1 DESCRIPTION

Term::TtyRec::Player playbacks ttyrec recorded data. See L<pttyplay>
and L<Term::TtyRec> for details about ttyrec.

=head1 METHODS

=over 4

=item new

  $player = Term::TtyRec::Player->new($handle, \%attr);

constructs new Term::TtyRec::Player instance.

=item play

  $player->play();

Plays recorded data on your terminal.

=item peek

  $player->peek();

Plays live-recoded data to your terminal. This method implements
ttyplay -p option.

=back

=head1 AUTHOR

Tatsuhiko Miyagawa <miyagawa@bulknews.net>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 SEE ALSO

L<Term::TtyRec>, L<pttyplay>, http://namazu.org/~satoru/ttyrec/

=cut