package BasicRole; use Moo::Role; has 'attrib' => ( is => 'ro' ); sub do_something { ... } 1; package NotSoBasicRole; use Moo::Role; with 'BasicRole'; has '+attrib' => ( is => 'ro', default => sub { return 1; } ); 1; package SpecialRole; use Moo::Role; with 'NotSoBasicRole'; has '+attrib' => ( is => 'ro', default => sub { return 2; } ); sub do_something_else { ... } 1; package App; use Moo; with 'BasicRole'; 1; package AnotherApp; use Moo; with 'SpecialRole'; 1; package main; use v5.10; no warnings; my $app = App->new(); say $app->attrib; my $another_app = AnotherApp->new(); say $another_app->attrib;