use strict; use warnings; { package Pie; use Moose; use Moose::Util::TypeConstraints; has q{ingredients} => (is => q{ro}, isa => q{ArrayRef}, default => sub { [] }); no Moose; 1; } { package Apple; use Moose::Role; around q{ingredients} => sub { my $next = shift; my @ingredients = @{ $next->(@_) }; return [@ingredients, q{apples}]; }; no Moose; 1; } { package Pear; use Moose::Role; around q{ingredients} => sub { my $next = shift; my @ingredients = @{ $next->(@_) }; return [@ingredients, q{pears}]; }; no Moose; 1; } { package Blackberry; use Moose::Role; around q{ingredients} => sub { my $next = shift; my @ingredients = @{ $next->(@_) }; return [@ingredients, q{blackberries}]; }; no Moose; 1; }