NAME
roles - A simple pragma for composing roles.
VERSION
version 0.03
SYNOPSIS
package Eq {
    use strict;
    use warnings;
    sub equal_to;
    sub not_equal_to {
        my ($self, $other) = @_;
        not $self->equal_to($other);
    }
}
package Comparable {
    use strict;
    use warnings;
    use roles 'Eq';
    sub compare;
    sub equal_to {
        my ($self, $other) = @_;
        $self->compare($other) == 0;
    }
    sub greater_than {
        my ($self, $other) = @_;
        $self->compare($other) == 1;
    }
    sub less_than {
        my ($self, $other) = @_;
        $self->compare($other) == -1;
    }
    sub greater_than_or_equal_to {
        my ($self, $other) = @_;
        $self->greater_than($other) || $self->equal_to($other);
    }
    sub less_than_or_equal_to {
        my ($self, $other) = @_;
        $self->less_than($other) || $self->equal_to($other);
    }
}
package Printable {
    use strict;
    use warnings;
    sub to_string;
}
package US::Currency {
    use strict;
    use warnings;
    use roles 'Comparable', 'Printable';
    sub new {
        my ($class, %args) = @_;
        bless { amount => $args{amount} // 0 } => $class;
    }
    sub compare {
        my ($self, $other) = @_;
        $self->{amount} <=> $other->{amount};
    }
    sub to_string {
        my ($self) = @_;
        sprintf '$%0.2f USD' => $self->{amount};
    }
}
# ...
US::Currency->roles::DOES('Eq');         # true
US::Currency->roles::DOES('Printable');  # true
US::Currency->roles::DOES('Comparable'); # true
DESCRIPTION
This is a very simple pragma which takes a list of roles as package names, adds them to the @DOES package variable and then schedules for role composition to occur during the next available UNITCHECK phase.
roles::DOES
Since Perl v5.10 there has been a UNIVERSAL::DOES method available, however it is unaware of this module so is not very useful to us. Instead we supply a replacement in the form of roles::DOES method that can be used like this:
$instance->roles::DOES('SomeRole');
AUTHOR
Stevan Little <stevan@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2017, 2018 by Stevan Little.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.