The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;


{
    package Parent;
    use Moo;
    has message => ( is => 'ro', required => 1 ),
}

{
    package Child;
    use Moose;
    extends 'Parent';
    use Moose::Util::TypeConstraints;
    use namespace::clean;   # <-- essential
    has message => (
        is => 'ro', isa => 'Str',
        lazy => 1,
        default => sub { 'overridden message sub here' },
    );
}

my $obj = Child->new(message => 'custom message');

use Test::More;
is($obj->message, 'custom message', 'accessor works');

done_testing;

__END__

without namespace::clean, gives the (non-fatal) warning:
You are overwriting a locally defined function (message) with an accessor

...because Moose::Util::TypeConstraints exports a 'message' sub!