# NAME UNIVERSAL::DOES - Provides UNIVERSAL::DOES() method for older perls # VERSION This document describes UNIVERSAL::DOES version 0.005. # SYNOPSIS # if you require UNIVERSAL::DOES, you can say the following: require UNIVERSAL::DOES unless defined &UNIVERSAL::DOES; # you can call DOES() in any perls $class->DOES($role); $object->DOES($role); # also, this provides a does() function use UNIVERSAL::DOES qw(does); # use does($thing, $role), instead of UNIVERSAL::isa($thing, $role) does($thing, $role); # $thing can be non-invocant does($thing, 'ARRAY'); # also ok, $think may have overloaded @{} # DESCRIPTION `UNIVERSAL::DOES` provides a `UNIVERSAL::DOES()` method for compatibility with perl 5.10.x. This module also provides a `does()` function that checks something does some roles, suggested in [perltodo](https://metacpan.org/pod/perltodo). # FUNCTIONS - `does($thing, $role)` `does` checks if _$thing_ performs the role _$role_. If the thing is an object or class, it simply checks `$thing->DOES($role)`. Otherwise it tells whether the thing can be dereferenced as an array/hash/etc. Unlike `UNIVERSAL::isa()`, it is semantically correct to use `does` for something unknown and to use it for `reftype`. This function handles overloading. For example, `does($thing, 'ARRAY')` returns true if the thing is an array reference, or if the thing is an object with overloaded `@{}`. This is not exported by default. # METHODS The following description is just copied from [UNIVERSAL](https://metacpan.org/pod/UNIVERSAL) in perl 5.10.1. - `$obj->DOES( $ROLE )` - `CLASS->DOES( $ROLE )` `DOES` checks if the object or class performs the role `ROLE`. A role is a named group of specific behavior (often methods of particular names and signatures), similar to a class, but not necessarily a complete class by itself. For example, logging or serialization may be roles. `DOES` and `isa` are similar, in that if either is true, you know that the object or class on which you call the method can perform specific behavior. However, `DOES` is different from `isa` in that it does not care _how_ the invocant performs the operations, merely that it does. (`isa` of course mandates an inheritance relationship. Other relationships include aggregation, delegation, and mocking.) By default, classes in Perl only perform the `UNIVERSAL` role, as well as the role of all classes in their inheritance. In other words, by default `DOES` responds identically to `isa`. There is a relationship between roles and classes, as each class implies the existence of a role of the same name. There is also a relationship between inheritance and roles, in that a subclass that inherits from an ancestor class implicitly performs any roles its parent performs. Thus you can use `DOES` in place of `isa` safely, as it will return true in all places where `isa` will return true (provided that any overridden `DOES` _and_ `isa` methods behave appropriately). # NOTES - ["UNIVERSAL::DOES()" in perl5100delta](https://metacpan.org/pod/perl5100delta#UNIVERSAL::DOES) says: The `UNIVERSAL` class has a new method, `DOES()`. It has been added to solve semantic problems with the `isa()` method. `isa()` checks for inheritance, while `DOES()` has been designed to be overridden when module authors use other types of relations between classes (in addition to inheritance). - ["A does() built-in" in perltodo](https://metacpan.org/pod/perltodo#A-does-built-in) says: Like ref(), only useful. It would call the `DOES` method on objects; it would also tell whether something can be dereferenced as an array/hash/etc., or used as a regexp, etc. [http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-03/msg00481.html](http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-03/msg00481.html) # DEPENDENCIES Perl 5.5.3 or later. # BUGS No bugs have been reported. Please report any bugs or feature requests to the author. # AUTHOR Goro Fuji (gfx) # SEE ALSO [UNIVERSAL](https://metacpan.org/pod/UNIVERSAL). # LICENSE AND COPYRIGHT Copyright (c) 2009, Goro Fuji (gfx). Some rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.