NAME
Class::DOES - Provide a simple ->DOES override
SYNOPSIS
package My::Class;
use Class::DOES qw/Some::Role/;
if (My::Class->DOES("Some::Role")) {
#...
}
DESCRIPTION
Perl 5.10 introduced a new method in UNIVERSAL: DOES
. This was added to support the concept of roles. A role is an interface (a set of methods, with associated semantics) that a class or an object can implement, without necessarily inheriting from it. A class declares that it implements a given role by overriding the ->DOES
method to return true when passed the name of the role.
This is all well and flexible, allowing advanced object systems like Moose to implement the ->DOES
override as they see fit, but what about ordinary classes that just want to declare they support a known interface? That's what this module is for: you pass it a list of roles on the use
line, and it gives you a ->DOES
override that returns true for
- - any role in the supplied list;
- - any class you inherit from;
- - any role supported by any class you inherit from.
It makes the following assumptions:
- - All your inheritance happens through
@ISA
. -
That is, you haven't overridden
->isa
. - - Noone else has given you a
->DOES
method. -
That is, none of your superclasses have their own
->DOES
override (other than one provided by this module).
If it detects either of these at use
time, it will issue a warning.
Setting %DOES
directly.
This module stores the roles you support in the %DOES
hash in your package. If you want ->DOES
to return something other that 1
for a role you support, you can make an entry in your %DOES
hash yourself and it will be picked up.
You should not make entries with false values, as this would be very confusing. If you do, then when ->DOES
is called it will return 1
instead of the given value, and will issue a warning.
DIAGNOSTICS
All of these can be disabled with
no warnings "Class::DOES";
- %s has inherited an incompatible ->DOES
-
You have issued
use Class::DOES
from a class that already has a->DOES
method. This inherited method will be completely ignored, so any roles it claims to support will be lost. - %s doesn't use @ISA for inheritance
-
You have issued
use Class::DOES
from a class with an overriden->isa
. Since the exported->DOES
method uses@ISA
to determine inheritance, any extra classes->isa
claims to inherit from will not be checked for the requested role. - $%s::DOES{%s} is false, returning 1
-
->DOES
has found a false entry in a%DOES
hash, and is returning1
instead to indicate the role is supported.
AUTHOR
Copyright 2009 Ben Morrow <ben@morrow.me.uk>.
This program is licensed under the same terms as Perl.
BUGS
Please send bug reports to <bug-Class-DOES@rt.cpan.org>.