package Plugh; sub new { my $class = shift; bless { @_ }, $class; } sub on_error_ignore { my $self = shift; } sub on_error_warn { my $self = shift; warn $@; } sub on_error_die { my $self = shift; die $@; } sub do_something_dangerous { my $self = shift; my $task = shift; # coderef eval { $task->(@_) }; if ($@) { my $error = $@; my $action = $self->{on_error} || 'on_error_die'; $self->$action($@); } } sub reciprocal { my $self = shift; my $somevalue = shift; my $result; $self->do_something_dangerous (sub { $result = 1 / $somevalue }); return $result; } sub open_file { my $self = shift; my $file = shift; my $filehandle; $self->do_something_dangerous (sub { open my $h, "<", $file or die "Cannot open $file: $!"; $filehandle = $h; }); return $filehandle; } 1;