If this is something you want to do on a number of attributes, you could use a method modifier to wrap them with exception handling. Here's an example:
use strict;
use warnings;
BEGIN {
package Foo;
use Moo;
use Types::Standard qw(Enum);
has error_mode => ( is => 'rw', isa => Enum[qw/carp error bot
+h/], default => 'error' );
has another_attribute => ( is => 'rw', isa => Enum[qw/doing a thing/
+], default => 'a' );
sub _err {
my ( $self, $err ) = @_;
warn $err;
}
around qw(error_mode another_attribute), sub {
my ($orig, $self) = (shift, shift);
my $return;
eval {
$return = $self->$orig(@_);
1;
} or do {
$self->_err($@);
return $self->$orig;
};
return $return;
};
1;
}
sub welp {
my $f = Foo->new;
$f->error_mode("blah");
$f->another_attribute("blah");
}
welp();
This would allow you to define all of your attributes using standard Moo* mechanisms, but convert a selection of them to 'soft' error handling.