xref: /openbsd/gnu/usr.bin/perl/ext/mro/mro.pm (revision 09467b48)
1#      mro.pm
2#
3#      Copyright (c) 2007 Brandon L Black
4#      Copyright (c) 2008,2009 Larry Wall and others
5#
6#      You may distribute under the terms of either the GNU General Public
7#      License or the Artistic License, as specified in the README file.
8#
9package mro;
10use strict;
11use warnings;
12
13# mro.pm versions < 1.00 reserved for MRO::Compat
14#  for partial back-compat to 5.[68].x
15our $VERSION = '1.22';
16
17require XSLoader;
18XSLoader::load('mro');
19
20sub import {
21    mro::set_mro(scalar(caller), $_[1]) if $_[1];
22}
23
24package # hide me from PAUSE
25    next;
26
27sub can { mro::_nextcan($_[0], 0) }
28
29sub method {
30    my $method = mro::_nextcan($_[0], 1);
31    goto &$method;
32}
33
34package # hide me from PAUSE
35    maybe::next;
36
37sub method {
38    my $method = mro::_nextcan($_[0], 0);
39    goto &$method if defined $method;
40    return;
41}
42
431;
44
45__END__
46
47=head1 NAME
48
49mro - Method Resolution Order
50
51=head1 SYNOPSIS
52
53  use mro; # enables next::method and friends globally
54
55  use mro 'dfs'; # enable DFS MRO for this class (Perl default)
56  use mro 'c3'; # enable C3 MRO for this class
57
58=head1 DESCRIPTION
59
60The "mro" namespace provides several utilities for dealing
61with method resolution order and method caching in general.
62
63These interfaces are only available in Perl 5.9.5 and higher.
64See L<MRO::Compat> on CPAN for a mostly forwards compatible
65implementation for older Perls.
66
67=head1 OVERVIEW
68
69It's possible to change the MRO of a given class either by using C<use
70mro> as shown in the synopsis, or by using the L</mro::set_mro> function
71below.
72
73The special methods C<next::method>, C<next::can>, and
74C<maybe::next::method> are not available until this C<mro> module
75has been loaded via C<use> or C<require>.
76
77=head1 The C3 MRO
78
79In addition to the traditional Perl default MRO (depth first
80search, called C<DFS> here), Perl now offers the C3 MRO as
81well.  Perl's support for C3 is based on the work done in
82Stevan Little's module L<Class::C3>, and most of the C3-related
83documentation here is ripped directly from there.
84
85=head2 What is C3?
86
87C3 is the name of an algorithm which aims to provide a sane method
88resolution order under multiple inheritance. It was first introduced in
89the language Dylan (see links in the L</"SEE ALSO"> section), and then
90later adopted as the preferred MRO (Method Resolution Order) for the
91new-style classes in Python 2.3. Most recently it has been adopted as the
92"canonical" MRO for Perl 6 classes, and the default MRO for Parrot objects
93as well.
94
95=head2 How does C3 work
96
97C3 works by always preserving local precedence ordering. This essentially
98means that no class will appear before any of its subclasses. Take, for
99instance, the classic diamond inheritance pattern:
100
101     <A>
102    /   \
103  <B>   <C>
104    \   /
105     <D>
106
107The standard Perl 5 MRO would be (D, B, A, C). The result being that B<A>
108appears before B<C>, even though B<C> is the subclass of B<A>. The C3 MRO
109algorithm however, produces the following order: (D, B, C, A), which does
110not have this issue.
111
112This example is fairly trivial; for more complex cases and a deeper
113explanation, see the links in the L</"SEE ALSO"> section.
114
115=head1 Functions
116
117=head2 mro::get_linear_isa($classname[, $type])
118
119Returns an arrayref which is the linearized MRO of the given class.
120Uses whichever MRO is currently in effect for that class by default,
121or the given MRO (either C<c3> or C<dfs> if specified as C<$type>).
122
123The linearized MRO of a class is an ordered array of all of the
124classes one would search when resolving a method on that class,
125starting with the class itself.
126
127If the requested class doesn't yet exist, this function will still
128succeed, and return C<[ $classname ]>
129
130Note that C<UNIVERSAL> (and any members of C<UNIVERSAL>'s MRO) are not
131part of the MRO of a class, even though all classes implicitly inherit
132methods from C<UNIVERSAL> and its parents.
133
134=head2 mro::set_mro ($classname, $type)
135
136Sets the MRO of the given class to the C<$type> argument (either
137C<c3> or C<dfs>).
138
139=head2 mro::get_mro($classname)
140
141Returns the MRO of the given class (either C<c3> or C<dfs>).
142
143=head2 mro::get_isarev($classname)
144
145Gets the C<mro_isarev> for this class, returned as an
146arrayref of class names.  These are every class that "isa"
147the given class name, even if the isa relationship is
148indirect.  This is used internally by the MRO code to
149keep track of method/MRO cache invalidations.
150
151As with C<mro::get_linear_isa> above, C<UNIVERSAL> is special.
152C<UNIVERSAL> (and parents') isarev lists do not include
153every class in existence, even though all classes are
154effectively descendants for method inheritance purposes.
155
156=head2 mro::is_universal($classname)
157
158Returns a boolean status indicating whether or not
159the given classname is either C<UNIVERSAL> itself,
160or one of C<UNIVERSAL>'s parents by C<@ISA> inheritance.
161
162Any class for which this function returns true is
163"universal" in the sense that all classes potentially
164inherit methods from it.
165
166=head2 mro::invalidate_all_method_caches()
167
168Increments C<PL_sub_generation>, which invalidates method
169caching in all packages.
170
171=head2 mro::method_changed_in($classname)
172
173Invalidates the method cache of any classes dependent on the
174given class.  This is not normally necessary.  The only
175known case where pure perl code can confuse the method
176cache is when you manually install a new constant
177subroutine by using a readonly scalar value, like the
178internals of L<constant> do.  If you find another case,
179please report it so we can either fix it or document
180the exception here.
181
182=head2 mro::get_pkg_gen($classname)
183
184Returns an integer which is incremented every time a
185real local method in the package C<$classname> changes,
186or the local C<@ISA> of C<$classname> is modified.
187
188This is intended for authors of modules which do lots
189of class introspection, as it allows them to very quickly
190check if anything important about the local properties
191of a given class have changed since the last time they
192looked.  It does not increment on method/C<@ISA>
193changes in superclasses.
194
195It's still up to you to seek out the actual changes,
196and there might not actually be any.  Perhaps all
197of the changes since you last checked cancelled each
198other out and left the package in the state it was in
199before.
200
201This integer normally starts off at a value of C<1>
202when a package stash is instantiated.  Calling it
203on packages whose stashes do not exist at all will
204return C<0>.  If a package stash is completely
205deleted (not a normal occurrence, but it can happen
206if someone does something like C<undef %PkgName::>),
207the number will be reset to either C<0> or C<1>,
208depending on how completely the package was wiped out.
209
210=head2 next::method
211
212This is somewhat like C<SUPER>, but it uses the C3 method
213resolution order to get better consistency in multiple
214inheritance situations.  Note that while inheritance in
215general follows whichever MRO is in effect for the
216given class, C<next::method> only uses the C3 MRO.
217
218One generally uses it like so:
219
220  sub some_method {
221    my $self = shift;
222    my $superclass_answer = $self->next::method(@_);
223    return $superclass_answer + 1;
224  }
225
226Note that you don't (re-)specify the method name.
227It forces you to always use the same method name
228as the method you started in.
229
230It can be called on an object or a class, of course.
231
232The way it resolves which actual method to call is:
233
234=over 4
235
236=item 1
237
238First, it determines the linearized C3 MRO of
239the object or class it is being called on.
240
241=item 2
242
243Then, it determines the class and method name
244of the context it was invoked from.
245
246=item 3
247
248Finally, it searches down the C3 MRO list until
249it reaches the contextually enclosing class, then
250searches further down the MRO list for the next
251method with the same name as the contextually
252enclosing method.
253
254=back
255
256Failure to find a next method will result in an
257exception being thrown (see below for alternatives).
258
259This is substantially different than the behavior
260of C<SUPER> under complex multiple inheritance.
261(This becomes obvious when one realizes that the
262common superclasses in the C3 linearizations of
263a given class and one of its parents will not
264always be ordered the same for both.)
265
266B<Caveat>: Calling C<next::method> from methods defined outside the class:
267
268There is an edge case when using C<next::method> from within a subroutine
269which was created in a different module than the one it is called from. It
270sounds complicated, but it really isn't. Here is an example which will not
271work correctly:
272
273  *Foo::foo = sub { (shift)->next::method(@_) };
274
275The problem exists because the anonymous subroutine being assigned to the
276C<*Foo::foo> glob will show up in the call stack as being called
277C<__ANON__> and not C<foo> as you might expect. Since C<next::method> uses
278C<caller> to find the name of the method it was called in, it will fail in
279this case.
280
281But fear not, there's a simple solution. The module C<Sub::Name> will
282reach into the perl internals and assign a name to an anonymous subroutine
283for you. Simply do this:
284
285  use Sub::Name 'subname';
286  *Foo::foo = subname 'Foo::foo' => sub { (shift)->next::method(@_) };
287
288and things will Just Work.
289
290=head2 next::can
291
292This is similar to C<next::method>, but just returns either a code
293reference or C<undef> to indicate that no further methods of this name
294exist.
295
296=head2 maybe::next::method
297
298In simple cases, it is equivalent to:
299
300   $self->next::method(@_) if $self->next::can;
301
302But there are some cases where only this solution
303works (like C<goto &maybe::next::method>);
304
305=head1 SEE ALSO
306
307=head2 The original Dylan paper
308
309=over 4
310
311=item L<http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.19.3910&rep=rep1&type=pdf>
312
313=back
314
315=head2 Pugs
316
317The Pugs prototype Perl 6 Object Model uses C3
318
319=head2 Parrot
320
321Parrot now uses C3
322
323=over 4
324
325=item L<http://use.perl.org/~autrijus/journal/25768>
326
327=back
328
329=head2 Python 2.3 MRO related links
330
331=over 4
332
333=item L<http://www.python.org/2.3/mro.html>
334
335=item L<http://www.python.org/2.2.2/descrintro.html#mro>
336
337=back
338
339=head2 Class::C3
340
341=over 4
342
343=item L<Class::C3>
344
345=back
346
347=head1 AUTHOR
348
349Brandon L. Black, E<lt>blblack@gmail.comE<gt>
350
351Based on Stevan Little's L<Class::C3>
352
353=cut
354