package Timer; use Time::HiRes qw(gettimeofday tv_interval); use Mojo::Base -base; use experimental 'signatures', 'postderef'; # keep an internal event log has '_event_log' => sub { [] }; has '_start_time' => sub { [ gettimeofday ] }; sub record ($self, $event_description) { # record the event and timestamp my $event = { timestamp => sprintf("%.3f", tv_interval($self->_start_time)), description => $event_description, }; push($self->event_log->@*, $event); } # render a full report sub report ($self) { my $report = ''; foreach my $event ($self->_event_log->@*) { $report .= '[' . $event->{timestamp} . '] ' . $event->{description} . "\n"; } return $report; } 1;