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 . This program is licensed under the same terms as Perl. BUGS Please send bug reports to .