Fix a CPANPLUS test that fails when run on a read-only source tree
[p5sagit/p5-mst-13.2.git] / lib / mro.pm
CommitLineData
e1a479c5 1# mro.pm
2#
3# Copyright (c) 2007 Brandon L Black
4#
5# You may distribute under the terms of either the GNU General Public
6# License or the Artistic License, as specified in the README file.
7#
8package mro;
9use strict;
10use warnings;
11
12# mro.pm versions < 1.00 reserved for possible CPAN mro dist
13# (for partial back-compat to 5.[68].x)
14our $VERSION = '1.00';
15
16sub import {
17 mro::set_mro(scalar(caller), $_[1]) if $_[1];
18}
19
201;
21
22__END__
23
24=head1 NAME
25
26mro - Method Resolution Order
27
28=head1 SYNOPSIS
29
2e4b0c4a 30 use mro 'dfs'; # enable DFS MRO for this class (Perl default)
31 use mro 'c3'; # enable C3 MRO for this class
e1a479c5 32
33=head1 DESCRIPTION
34
35The "mro" namespace provides several utilities for dealing
36with method resolution order and method caching in general.
37
38=head1 OVERVIEW
39
2e4b0c4a 40It's possible to change the MRO of a given class either by using C<use
41mro> as shown in the synopsis, or by using the L</mro::set_mro> function
42below. The functions do not require loading the C<mro> module, as they
43are actually provided by the core perl interpreter. The C<use mro> syntax
44is just syntactic sugar for setting the current package's MRO.
e1a479c5 45
46=head1 The C3 MRO
47
48In addition to the traditional Perl default MRO (depth first
2e4b0c4a 49search, called C<DFS> here), Perl now offers the C3 MRO as
e1a479c5 50well. Perl's support for C3 is based on the work done in
2e4b0c4a 51Stevan Little's module L<Class::C3>, and most of the C3-related
e1a479c5 52documentation here is ripped directly from there.
53
54=head2 What is C3?
55
2e4b0c4a 56C3 is the name of an algorithm which aims to provide a sane method
57resolution order under multiple inheritance. It was first introduced in
58the language Dylan (see links in the L</"SEE ALSO"> section), and then
59later adopted as the preferred MRO (Method Resolution Order) for the
60new-style classes in Python 2.3. Most recently it has been adopted as the
61"canonical" MRO for Perl 6 classes, and the default MRO for Parrot objects
62as well.
e1a479c5 63
2e4b0c4a 64=head2 How does C3 work
e1a479c5 65
2e4b0c4a 66C3 works by always preserving local precendence ordering. This essentially
67means that no class will appear before any of its subclasses. Take, for
68instance, the classic diamond inheritance pattern:
e1a479c5 69
70 <A>
71 / \
72 <B> <C>
73 \ /
74 <D>
75
2e4b0c4a 76The standard Perl 5 MRO would be (D, B, A, C). The result being that B<A>
77appears before B<C>, even though B<C> is the subclass of B<A>. The C3 MRO
78algorithm however, produces the following order: (D, B, C, A), which does
79not have this issue.
e1a479c5 80
2e4b0c4a 81This example is fairly trivial; for more complex cases and a deeper
82explanation, see the links in the L</"SEE ALSO"> section.
e1a479c5 83
84=head1 Functions
85
2e4b0c4a 86=head2 mro::get_linear_isa($classname[, $type])
e1a479c5 87
2e4b0c4a 88Returns an arrayref which is the linearized MRO of the given class.
e1a479c5 89Uses whichever MRO is currently in effect for that class by default,
2e4b0c4a 90or the given MRO (either C<c3> or C<dfs> if specified as C<$type>).
e1a479c5 91
2e4b0c4a 92Note that C<UNIVERSAL> (and any members of C<UNIVERSAL>'s MRO) are not
93part of the MRO of a class, even though all classes implicitly inherit
e1a479c5 94methods from C<UNIVERSAL> and its parents.
95
2e4b0c4a 96=head2 mro::set_mro($classname, $type)
e1a479c5 97
2e4b0c4a 98Sets the MRO of the given class to the C<$type> argument (either
e1a479c5 99C<c3> or C<dfs>).
100
2e4b0c4a 101=head2 mro::get_mro($classname)
e1a479c5 102
2e4b0c4a 103Returns the MRO of the given class (either C<c3> or C<dfs>).
e1a479c5 104
2e4b0c4a 105=head2 mro::get_isarev($classname)
e1a479c5 106
107Gets the C<mro_isarev> for this class, returned as an
2e4b0c4a 108array of class names. These are every class that "isa"
109the given class name, even if the isa relationship is
110indirect. This is used internally by the MRO code to
111keep track of method/MRO cache invalidations.
e1a479c5 112
113Currently, this list only grows, it never shrinks. This
114was a performance consideration (properly tracking and
115deleting isarev entries when someone removes an entry
116from an C<@ISA> is costly, and it doesn't happen often
117anyways). The fact that a class which no longer truly
118"isa" this class at runtime remains on the list should be
119considered a quirky implementation detail which is subject
120to future change. It shouldn't be an issue as long as
121you're looking at this list for the same reasons the
122core code does: as a performance optimization
123over having to search every class in existence.
124
125As with C<mro::get_mro> above, C<UNIVERSAL> is special.
126C<UNIVERSAL> (and parents') isarev lists do not include
127every class in existence, even though all classes are
128effectively descendants for method inheritance purposes.
129
2e4b0c4a 130=head2 mro::is_universal($classname)
e1a479c5 131
132Returns a boolean status indicating whether or not
133the given classname is either C<UNIVERSAL> itself,
134or one of C<UNIVERSAL>'s parents by C<@ISA> inheritance.
135
136Any class for which this function returns true is
137"universal" in the sense that all classes potentially
138inherit methods from it.
139
140For similar reasons to C<isarev> above, this flag is
141permanent. Once it is set, it does not go away, even
142if the class in question really isn't universal anymore.
143
2e4b0c4a 144=head2 mro::invalidate_all_method_caches()
e1a479c5 145
146Increments C<PL_sub_generation>, which invalidates method
147caching in all packages.
148
2e4b0c4a 149=head2 mro::method_changed_in($classname)
e1a479c5 150
2e4b0c4a 151Invalidates the method cache of any classes dependent on the
e1a479c5 152given class.
153
154=head2 next::method
155
156This is somewhat like C<SUPER>, but it uses the C3 method
157resolution order to get better consistency in multiple
158inheritance situations. Note that while inheritance in
159general follows whichever MRO is in effect for the
160given class, C<next::method> only uses the C3 MRO.
161
162One generally uses it like so:
163
164 sub some_method {
165 my $self = shift;
e1a479c5 166 my $superclass_answer = $self->next::method(@_);
167 return $superclass_answer + 1;
168 }
169
170Note that you don't (re-)specify the method name.
171It forces you to always use the same method name
172as the method you started in.
173
174It can be called on an object or a class, of course.
175
176The way it resolves which actual method to call is:
177
2e4b0c4a 178=over 4
179
180=item 1
181
182First, it determines the linearized C3 MRO of
e1a479c5 183the object or class it is being called on.
184
2e4b0c4a 185=item 2
186
187Then, it determines the class and method name
e1a479c5 188of the context it was invoked from.
189
2e4b0c4a 190=item 3
191
192Finally, it searches down the C3 MRO list until
e1a479c5 193it reaches the contextually enclosing class, then
194searches further down the MRO list for the next
195method with the same name as the contextually
196enclosing method.
197
2e4b0c4a 198=back
199
e1a479c5 200Failure to find a next method will result in an
201exception being thrown (see below for alternatives).
202
203This is substantially different than the behavior
2e4b0c4a 204of C<SUPER> under complex multiple inheritance.
205(This becomes obvious when one realizes that the
e1a479c5 206common superclasses in the C3 linearizations of
207a given class and one of its parents will not
2e4b0c4a 208always be ordered the same for both.)
e1a479c5 209
2e4b0c4a 210B<Caveat>: Calling C<next::method> from methods defined outside the class:
e1a479c5 211
2e4b0c4a 212There is an edge case when using C<next::method> from within a subroutine
213which was created in a different module than the one it is called from. It
214sounds complicated, but it really isn't. Here is an example which will not
215work correctly:
e1a479c5 216
217 *Foo::foo = sub { (shift)->next::method(@_) };
218
2e4b0c4a 219The problem exists because the anonymous subroutine being assigned to the
220C<*Foo::foo> glob will show up in the call stack as being called
221C<__ANON__> and not C<foo> as you might expect. Since C<next::method> uses
222C<caller> to find the name of the method it was called in, it will fail in
223this case.
224
225But fear not, there's a simple solution. The module C<Sub::Name> will
226reach into the perl internals and assign a name to an anonymous subroutine
227for you. Simply do this:
e1a479c5 228
e1a479c5 229 use Sub::Name 'subname';
230 *Foo::foo = subname 'Foo::foo' => sub { (shift)->next::method(@_) };
231
232and things will Just Work.
233
234=head2 next::can
235
2e4b0c4a 236This is similar to C<next::method>, but just returns either a code
237reference or C<undef> to indicate that no further methods of this name
238exist.
e1a479c5 239
240=head2 maybe::next::method
241
2e4b0c4a 242In simple cases, it is equivalent to:
e1a479c5 243
244 $self->next::method(@_) if $self->next_can;
245
246But there are some cases where only this solution
2e4b0c4a 247works (like C<goto &maybe::next::method>);
e1a479c5 248
2e4b0c4a 249=head1 SEE ALSO
e1a479c5 250
251=head2 The original Dylan paper
252
253=over 4
254
255=item L<http://www.webcom.com/haahr/dylan/linearization-oopsla96.html>
256
257=back
258
259=head2 The prototype Perl 6 Object Model uses C3
260
261=over 4
262
263=item L<http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/>
264
265=back
266
267=head2 Parrot now uses C3
268
269=over 4
270
271=item L<http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631>
272
273=item L<http://use.perl.org/~autrijus/journal/25768>
274
275=back
276
277=head2 Python 2.3 MRO related links
278
279=over 4
280
281=item L<http://www.python.org/2.3/mro.html>
282
283=item L<http://www.python.org/2.2.2/descrintro.html#mro>
284
285=back
286
287=head2 C3 for TinyCLOS
288
289=over 4
290
291=item L<http://www.call-with-current-continuation.org/eggs/c3.html>
292
293=back
294
295=head2 Class::C3
296
297=over 4
298
299=item L<Class::C3>
300
301=back
302
303=head1 AUTHOR
304
305Brandon L. Black, E<lt>blblack@gmail.comE<gt>
306
307Based on Stevan Little's L<Class::C3>
308
309=cut