package Enginesub; use strict; use warnings; sub new { my ($class, %arg) = @_; my $objref = { _name => $arg{name} || "unknown", }; bless $objref, $class; return $objref; } sub name { return $_[0]->{_name}; } sub go { my $self = shift @_; $SIG{ALRM} = \&ti; eval { alarm(2); print "name ", $self->name, " (2 seconds) sub input: "; chomp(my $input = ); alarm(0); }; if ($@ =~ /TIMEOUT/) { print "\n\nno input running defaults.....\n\n"; } sub ti { die "TIMEOUT"; } } 1; package Engine; use Enginesub; use strict; use warnings; sub new { my $class = shift; my $objref = { }; $objref->{OBJECTS} = []; bless $objref, $class; return $objref; } sub createobj { my $self = shift @_; my $aref = $self->{OBJECTS}; push @$aref, Enginesub->new(name => "name1"); push @$aref, Enginesub->new(name => "name2"); } sub run { my $self = shift @_; my $aref = $self->{OBJECTS}; foreach(@$aref) { $_->go(); } } 1; #!/usr/bin/perl use strict; use warnings; use Engine; my $engine = Engine->new(); $engine->createobj(); $SIG{ALRM} = \&timed_out; while() { eval { alarm(5); print "\n\n5 seconds main input: "; chomp(my $input = ); alarm(0); }; if ($@ =~ /BLAH/) { print "\n\nno input running....\n\n"; $engine->run(); } sub timed_out { die "BLAH"; } }