TagProvider.pm

package TagProvider;

use MooseX::ComposedBehavior {
  sugar_name   => 'add_tags',
  also_compose => [ qw(_instance_tags) ],
  compositor   => sub { @{ $_[1] } }, # @_ is ($self, \@all_results),
  method_name  => 'tags',
};

Foo.pm

package Foo;
use Moose::Role;
use TagProvider;

add_tags { qw(foo bar) };

Bar.pm

package Bar;
use Moose::Role;
use TagProvider;

add_tags { qw(bar quux) };

Thing.pm

package Thing;
use Moose;
use TagProvider;
with qw(Foo Bar);

add_tags { qw(bingo) };

has tags => (
  isa => 'ArrayRef[Str]',
  traits   => 'Array',
  handles  => { _instance_tags => 'elements' },
  init_arg => 'tags',
);

code

my $obj = Thing->new({ tags => [ qw(xyzzy) ] });

$obj->tags;  # bag of: foo bar bar quux bingo xyzzy