#!/usr/bin/env perl
use v5.14;
package Roles::Jumper {
use Role::Tiny;
# The 'jump' method calls 'name', which means that all
# classes that consume this role, must provide a 'name'
# method.
#
requires "name";
# And here's the 'jump' method itself.
#
sub jump {
my $self = shift;
say $self->name, " jumps!";
}
}
package Pet::Dog {
# The Pet::Dog class should consume Roles::Jumper.
#
use Role::Tiny::With;
with "Roles::Jumper";
sub new {
my $class = shift;
bless {@_}, $class;
}
sub name {
my $self = shift;
return $self->{name};
}
sub sound {
my $self = shift;
say $self->name, " says woof!";
}
}
package Pet::Cat {
# The Pet::Cat class should also consume Roles::Jumper.
#
use Role::Tiny::With;
with "Roles::Jumper";
sub new {
my $class = shift;
bless {@_}, $class;
}
sub name {
my $self = shift;
return $self->{name};
}
sub sound {
my $self = shift;
say $self->name, " says meow!";
}
}
my $fido = Pet::Dog->new(name => "Fido");
$fido->jump;
$fido->sound;
my $felix = Pet::Cat->new(name => "Felix");
$felix->jump;
$felix->sound;
####
#!/usr/bin/env perl
use v5.14;
package Pet::Mammal {
sub new {
my $class = shift;
bless {@_}, $class;
}
sub name {
my $self = shift;
return $self->{name};
}
sub jump {
my $self = shift;
say $self->name, " jumps!";
}
}
package Pet::Dog {
use base "Pet::Mammal";
sub sound {
my $self = shift;
say $self->name, " says woof!";
}
}
package Pet::Cat {
use base "Pet::Mammal";
sub sound {
my $self = shift;
say $self->name, " says meow!";
}
}
my $fido = Pet::Dog->new(name => "Fido");
$fido->jump;
$fido->sound;
my $felix = Pet::Cat->new(name => "Felix");
$felix->jump;
$felix->sound;
####
package Security::Guard {
use Role::Tiny;
requires "sound";
sub raise_alarm {
my $self = shift;
$self->sound;
}
}
package Guard::Dog {
use base "Pet::Dog";
use Role::Tiny::With;
with "Security::Guard";
}