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 returning 1 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>.