Roles are collections of methods and attributes that can be mixed into classes. A role provides an alternate form of code reuse from inheritance. Roles are typically mixed in using "does".

role Seller {
  method sell { say self.^name ~ ' is selling' }
}

role Buyer {
  method buy { say self.^name ~ ' is buying' }
}

class Consumer does Buyer {}
class Producer does Seller {}
class Company does Buyer does Seller {}

my $producer = Producer.new;
my $consumer = Consumer.new;
my $company = Company.new;

$producer.sell;
$consumer.buy;
$company.sell;
$company.buy;


Output:

Producer is selling
Consumer is buying
Company is selling
Company is buying