NAME
Perl6::Role - Perl6 roles in Perl5
SYNOPSIS
package
Some::Role;
# to make the package a role,
# just inherit from Perl6::Roles
sub
foo { ... }
sub
foobar { ... }
package
Some::Other::Role;
sub
bar { ... }
package
Your::Class;
use
Some::Role;
Some::Role->apply( __PACKAGE__ );
# or ...
Some::Role->apply(
'Some::Class'
);
sub
new { ... }
sub
foobar { ... }
sub
bar { ... }
package
main;
my
$object
= Your::Class->new;
$object
->foo();
# This calls Some::Role::foo()
$object
->bar();
# This calls Your::Class::bar()
$object
->foobar();
# This calls Your::Class::foobar()
if
( Your::Class->does(
'Some::Role'
) ) {
# This will evaluate as true
}
if
(
$object
->does(
'Some::Role'
) ) {
# This will evaluate as true
}
Some::Other::Role->apply(
$object
);
if
( Your::Class->does(
'Some::Other::Role'
) ) {
# This will evaluate as false
}
if
(
$object
->does(
'Some::Other::Role'
) ) {
# This will evaluate as true
}
DESCRIPTION
This is an implementation of current state of Perl6 roles in Perl5. It draws very heavily from both the Class::Role and Class::Roles modules, but is backwards compatible with neither of them.
ROLES
What is a Role?
Roles are a form of behavior reuse, and can be thought of as a collection of methods unassociated with a particular class. Roles are composed into classes, at which point the methods in the role are flattened into that particular class.
A valid role is one that inherits directly from Perl6::Roles and does not inherit from anything else. Other than that, it is just a package with methods inside.
Is attribute composition supported?
Since Perl (5) provides no consistent way to handle instance attributes, it is difficult to code this behavior in a generic way. That is not to say it is not possible to do this, especially given some kind of consistent class/instance structure. However, this is left as an exercise for the reader.
METHODS
apply( $class|$object )
If a $class, this will apply the role (which is the invocant) to the given class. It will add all the methods within the role that the class doesn't already have and mark the class as 'does' the role.
If an $object, this will create a new class that inherits from the original class, apply the role to that new class, and rebless the object into that new class.
does( $role )
This method is not actually contained within Perl6::Roles. It is installed in UNIVERSAL, which is the package that all objects automagically inherit from. This allows the syntax $some_random_object->does( 'Some::Role' );
.
This method will return true if the given class or object 'does' the given role and false otherwise.
Note: A class does itself and all its parents. An object does its class and all of its parent classes.
CODE COVERAGE
We use Devel::Cover to test the code coverage of our tests. Below is the Devel::Cover report on this module's test suite.
---------------------------- ------ ------ ------ ------ ------ ------ ------
File stmt bran cond
sub
pod
time
total
---------------------------- ------ ------ ------ ------ ------ ------ ------
/Perl6/Roles.pm 100.0 100.0 90.9 100.0 100.0 100.0 99.2
Total 100.0 100.0 90.9 100.0 100.0 100.0 99.2
---------------------------- ------ ------ ------ ------ ------ ------ ------
ACKNOWLEDGEMENTS
This code is based very heavily upon both Class::Role (written by Luke Palmer) and Class::Roles (written by chromatic).
AUTHORS
Rob Kinyon <rob.kinyon@iinteractive.com>
Stevan Little <stevan.little@iinteractive.com>
Thanks to Infinity Interactive for generously donating our time.
COPYRIGHT AND LICENSE
Copyright 2005 by Infinity Interactive, Inc.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.