--- Session.pm 2007/08/05 15:16:10 150 +++ Session.pm 2007/09/30 19:50:30 186 @@ -5,19 +5,27 @@ use strict; use warnings; -use Carp qw/confess/; +use Carp qw/confess croak/; use Data::Dump qw/dump/; use File::Slurp; +use POSIX qw/strftime/; use base qw/Class::Accessor/; -#__PACKAGE__->mk_accessors(qw()); +__PACKAGE__->mk_accessors(qw(session_uuid session_path)); =head1 NAME Session - save or load emulator interactive session -=cut +=head1 DESCRIPTION + +Sessions are simple perl programs using one function C + + event( $ticks_wait, 'name', $hash ); + +Using this, you can refactor your sessions or use perl constructs around +them. =head1 FUNCTIONS @@ -27,25 +35,69 @@ =cut +my $last_tick = 0; + +my $t = 0; +my @timeline; +my $s; + sub record_session { my $self = shift; my $name = shift || confess "need name"; + my $value = shift || confess "need value"; + + my $path = $self->session_path; + + if ( ! $path ) { + $path = 'sess/current'; + $self->session_path( $path ); + if ( -e $path ) { + warn "session appending to: $path\n"; + } else { + warn "session creating: $path\n"; + } + } + + if ( @timeline ) { + warn "INFO: Aborting recorderd session\n"; + @timeline = (); + $t = 0; + $s = {}; + $last_tick = 0; + } my $t = $self->app->ticks; + my $dt = $t - $last_tick; + $last_tick = $t; + + if ( ! $self->session_uuid ) { + my $uuid = strftime('%Y-%m-%d %H:%M:%S',localtime); + $self->append_to_file($path, "# $uuid\n"); + $self->session_uuid( $uuid ); + } - $self->append_to_file('session.pl', "\$s->{$t}->{'$name'} = ", dump( @_ ),";\n"); + $self->append_to_file($path, 'event(', dump( $dt, $name, $value ),");\n"); } +sub event { + my $dt = shift || croak 'expected dt'; + my $name = shift || croak 'expected name'; + my $value = shift || croak 'expected value'; + + $t += $dt; + push @timeline, $t; + $s->{$t}->{$name} = $value; + +# warn "## created event($dt,$name,",dump($value),")\n"; +} + =head2 load_session $self->load_session( '/path/to/session.pl' ); =cut -my $s; -my @timeline; - sub load_session { my $self = shift; my $path = shift || confess "no path?"; @@ -56,9 +108,7 @@ } eval read_file( $path ); - warn "session = ",dump( $s ); - - @timeline = sort { $a <=> $b } keys %$s; + warn "session = ",dump( $s ) if $self->debug; my ( $from, $to ) = @timeline[0,-1]; printf "loaded session %.2f-%.2fs with %d events\n", $from / 1000, $to / 1000, $#timeline + 1;