use v5.14; use Data::Dumper; package MyClass { use Moo; has base_file => ( is => 'rw', required => 1, init_arg => 'base', builder => sub { return 'bar' }, ); } # builder sub is *NOT* executed my $object1 = MyClass2->new(base => "foo"); print Dumper($object->base_file); # $VAR1 = 'foo' # builder sub *IS* executed my $object2 = MyClass->new(); print Dumper($object2->base_file); # $VAR1 = 'bar' #### use v5.14; use Data::Dumper; use IO::File; package MyClass { use Moo; has base_file => ( is => 'rw', required => 1, init_arg => 'base', coerce => sub { my $base_fh = IO::File->new( $_[0], '<' ) or die "$_[0]: $!"; $base_fh->binmode(":utf8"); return $base_fh; }, ); } my $object = MyClass->new(base => __FILE__); print Dumper($object->base_file); #### use v5.14; use Data::Dumper; use IO::File; package MyClass { use Moo; has base => ( is => 'rw', required => 1, ); has base_file => ( is => 'rw', lazy => 1, builder => sub { my $base_fh = IO::File->new($_[0]->base, '<' ) or die($_[0]->base . ": $!"); $base_fh->binmode(":utf8"); return $base_fh; }, ); } my $object = MyClass->new(base => __FILE__); print Dumper($object->base_file);