From: chromatic Date: Sat, 17 Jun 2006 17:24:03 +0000 (-0700) Subject: Add Documentation for DOES() X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7d1bbbe8b54b3a128fb15bc6b5a4682e0cbf915b;p=p5sagit%2Fp5-mst-13.2.git Add Documentation for DOES() Message-Id: <200606171724.04302.chromatic@wgz.org> p4raw-id: //depot/perl@28403 --- diff --git a/lib/UNIVERSAL.pm b/lib/UNIVERSAL.pm index eee8306..0d6fbe0 100644 --- a/lib/UNIVERSAL.pm +++ b/lib/UNIVERSAL.pm @@ -1,6 +1,6 @@ package UNIVERSAL; -our $VERSION = '1.03'; +our $VERSION = '1.04'; # UNIVERSAL should not contain any extra subs/methods beyond those # that it exists to define. The use of Exporter below is a historical @@ -27,18 +27,21 @@ UNIVERSAL - base class for ALL classes (blessed references) =head1 SYNOPSIS - $is_io = $fd->isa("IO::Handle"); - $is_io = Class->isa("IO::Handle"); + $is_io = $fd->isa("IO::Handle"); + $is_io = Class->isa("IO::Handle"); - $sub = $obj->can("print"); - $sub = Class->can("print"); + $does_log = $obj->DOES("Logger"); + $does_log = Class->DOES("Logger"); - $sub = eval { $ref->can("fandango") }; - $ver = $obj->VERSION; + $sub = $obj->can("print"); + $sub = Class->can("print"); + + $sub = eval { $ref->can("fandango") }; + $ver = $obj->VERSION; # but never do this! - $is_io = UNIVERSAL::isa($fd, "IO::Handle"); - $sub = UNIVERSAL::can($obj, "print"); + $is_io = UNIVERSAL::isa($fd, "IO::Handle"); + $sub = UNIVERSAL::can($obj, "print"); =head1 DESCRIPTION @@ -98,6 +101,33 @@ check the invocant with C from L first: ... } +=item C<< $obj->DOES( ROLE ) >> + +=item C<< CLASS->DOES( ROLE ) >> + +C checks if the object or class performs the role C. 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. + +C and C 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, C is different from C in that it does not care I the +invocant performs the operations, merely that it does. (C of course +mandates an inheritance relationship. Other relationships include aggregation, +delegation, and mocking.) + +By default, classes in Perl only perform the C role. To mark that +your own classes perform other roles, override C appropriately. + +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 C in +place of C safely, as it will return true in all places where C will +return true (provided that any overridden C I C methods behave +appropriately). + =item C<< $obj->can( METHOD ) >> =item C<< CLASS->can( METHOD ) >> @@ -139,9 +169,8 @@ method. None by default. -You may request the import of all three functions (C, C, and -C), however it is usually harmful to do so. Please don't do this in -new code. +You may request the import of three functions (C, C, and C), +however it is usually harmful to do so. Please don't do this in new code. For example, previous versions of this documentation suggested using C as a function to determine the type of a reference: