--- Session.pm 2007/08/05 15:16:10 150 +++ Session.pm 2007/08/05 18:25:53 159 @@ -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)); =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,14 +35,50 @@ =cut +my $path = 'session.pl'; + +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"; + + if ( @timeline ) { + warn "INFO: Aborting recorderd session\n"; + @timeline = (); + $t = 0; + $s = {}; + } 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($path, 'event(', dump( $dt, $name, $value ),");\n"); + +} - $self->append_to_file('session.pl', "\$s->{$t}->{'$name'} = ", dump( @_ ),";\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 @@ -43,9 +87,6 @@ =cut -my $s; -my @timeline; - sub load_session { my $self = shift; my $path = shift || confess "no path?"; @@ -58,8 +99,6 @@ eval read_file( $path ); warn "session = ",dump( $s ); - @timeline = sort { $a <=> $b } keys %$s; - my ( $from, $to ) = @timeline[0,-1]; printf "loaded session %.2f-%.2fs with %d events\n", $from / 1000, $to / 1000, $#timeline + 1; }