1NEXT(3pm)              Perl Programmers Reference Guide              NEXT(3pm)
2
3
4

NAME

6       NEXT - Provide a pseudo-class NEXT (et al) that allows method
7       redispatch
8

SYNOPSIS

10           use NEXT;
11
12           package P;
13           sub P::method   { print "$_[0]: P method\n";   $_[0]->NEXT::method() }
14           sub P::DESTROY  { print "$_[0]: P dtor\n";     $_[0]->NEXT::DESTROY() }
15
16           package Q;
17           use base qw( P );
18           sub Q::AUTOLOAD { print "$_[0]: Q AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
19           sub Q::DESTROY  { print "$_[0]: Q dtor\n";     $_[0]->NEXT::DESTROY() }
20
21           package R;
22           sub R::method   { print "$_[0]: R method\n";   $_[0]->NEXT::method() }
23           sub R::AUTOLOAD { print "$_[0]: R AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
24           sub R::DESTROY  { print "$_[0]: R dtor\n";     $_[0]->NEXT::DESTROY() }
25
26           package S;
27           use base qw( Q R );
28           sub S::method   { print "$_[0]: S method\n";   $_[0]->NEXT::method() }
29           sub S::AUTOLOAD { print "$_[0]: S AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
30           sub S::DESTROY  { print "$_[0]: S dtor\n";     $_[0]->NEXT::DESTROY() }
31
32           package main;
33
34           my $obj = bless {}, "S";
35
36           $obj->method();             # Calls S::method, P::method, R::method
37           $obj->missing_method(); # Calls S::AUTOLOAD, Q::AUTOLOAD, R::AUTOLOAD
38
39           # Clean-up calls S::DESTROY, Q::DESTROY, P::DESTROY, R::DESTROY
40

DESCRIPTION

42       The "NEXT" module adds a pseudoclass named "NEXT" to any program that
43       uses it. If a method "m" calls "$self->NEXT::m()", the call to "m" is
44       redispatched as if the calling method had not originally been found.
45
46       Note: before using this module, you should look at next::method
47       <https://metacpan.org/pod/mro#next::method> in the core mro module.
48       "mro" has been a core module since Perl 5.9.5.
49
50       In other words, a call to "$self->NEXT::m()" resumes the depth-first,
51       left-to-right search of $self's class hierarchy that resulted in the
52       original call to "m".
53
54       Note that this is not the same thing as "$self->SUPER::m()", which
55       begins a new dispatch that is restricted to searching the ancestors of
56       the current class. "$self->NEXT::m()" can backtrack past the current
57       class -- to look for a suitable method in other ancestors of $self --
58       whereas "$self->SUPER::m()" cannot.
59
60       A typical use would be in the destructors of a class hierarchy, as
61       illustrated in the SYNOPSIS above. Each class in the hierarchy has a
62       DESTROY method that performs some class-specific action and then
63       redispatches the call up the hierarchy. As a result, when an object of
64       class S is destroyed, the destructors of all its parent classes are
65       called (in depth-first, left-to-right order).
66
67       Another typical use of redispatch would be in "AUTOLOAD"'ed methods.
68       If such a method determined that it was not able to handle a particular
69       call, it might choose to redispatch that call, in the hope that some
70       other "AUTOLOAD" (above it, or to its left) might do better.
71
72       By default, if a redispatch attempt fails to find another method
73       elsewhere in the objects class hierarchy, it quietly gives up and does
74       nothing (but see "Enforcing redispatch"). This gracious acquiescence is
75       also unlike the (generally annoying) behaviour of "SUPER", which throws
76       an exception if it cannot redispatch.
77
78       Note that it is a fatal error for any method (including "AUTOLOAD") to
79       attempt to redispatch any method that does not have the same name. For
80       example:
81
82               sub S::oops { print "oops!\n"; $_[0]->NEXT::other_method() }
83
84   Enforcing redispatch
85       It is possible to make "NEXT" redispatch more demandingly (i.e. like
86       "SUPER" does), so that the redispatch throws an exception if it cannot
87       find a "next" method to call.
88
89       To do this, simple invoke the redispatch as:
90
91               $self->NEXT::ACTUAL::method();
92
93       rather than:
94
95               $self->NEXT::method();
96
97       The "ACTUAL" tells "NEXT" that there must actually be a next method to
98       call, or it should throw an exception.
99
100       "NEXT::ACTUAL" is most commonly used in "AUTOLOAD" methods, as a means
101       to decline an "AUTOLOAD" request, but preserve the normal exception-on-
102       failure semantics:
103
104               sub AUTOLOAD {
105                       if ($AUTOLOAD =~ /foo|bar/) {
106                               # handle here
107                       }
108                       else {  # try elsewhere
109                               shift()->NEXT::ACTUAL::AUTOLOAD(@_);
110                       }
111               }
112
113       By using "NEXT::ACTUAL", if there is no other "AUTOLOAD" to handle the
114       method call, an exception will be thrown (as usually happens in the
115       absence of a suitable "AUTOLOAD").
116
117   Avoiding repetitions
118       If "NEXT" redispatching is used in the methods of a "diamond" class
119       hierarchy:
120
121               #     A   B
122               #    / \ /
123               #   C   D
124               #    \ /
125               #     E
126
127               use NEXT;
128
129               package A;
130               sub foo { print "called A::foo\n"; shift->NEXT::foo() }
131
132               package B;
133               sub foo { print "called B::foo\n"; shift->NEXT::foo() }
134
135               package C; @ISA = qw( A );
136               sub foo { print "called C::foo\n"; shift->NEXT::foo() }
137
138               package D; @ISA = qw(A B);
139               sub foo { print "called D::foo\n"; shift->NEXT::foo() }
140
141               package E; @ISA = qw(C D);
142               sub foo { print "called E::foo\n"; shift->NEXT::foo() }
143
144               E->foo();
145
146       then derived classes may (re-)inherit base-class methods through two or
147       more distinct paths (e.g. in the way "E" inherits "A::foo" twice --
148       through "C" and "D"). In such cases, a sequence of "NEXT" redispatches
149       will invoke the multiply inherited method as many times as it is
150       inherited. For example, the above code prints:
151
152               called E::foo
153               called C::foo
154               called A::foo
155               called D::foo
156               called A::foo
157               called B::foo
158
159       (i.e. "A::foo" is called twice).
160
161       In some cases this may be the desired effect within a diamond
162       hierarchy, but in others (e.g. for destructors) it may be more
163       appropriate to call each method only once during a sequence of
164       redispatches.
165
166       To cover such cases, you can redispatch methods via:
167
168               $self->NEXT::DISTINCT::method();
169
170       rather than:
171
172               $self->NEXT::method();
173
174       This causes the redispatcher to only visit each distinct "method"
175       method once. That is, to skip any classes in the hierarchy that it has
176       already visited during redispatch. So, for example, if the previous
177       example were rewritten:
178
179               package A;
180               sub foo { print "called A::foo\n"; shift->NEXT::DISTINCT::foo() }
181
182               package B;
183               sub foo { print "called B::foo\n"; shift->NEXT::DISTINCT::foo() }
184
185               package C; @ISA = qw( A );
186               sub foo { print "called C::foo\n"; shift->NEXT::DISTINCT::foo() }
187
188               package D; @ISA = qw(A B);
189               sub foo { print "called D::foo\n"; shift->NEXT::DISTINCT::foo() }
190
191               package E; @ISA = qw(C D);
192               sub foo { print "called E::foo\n"; shift->NEXT::DISTINCT::foo() }
193
194               E->foo();
195
196       then it would print:
197
198               called E::foo
199               called C::foo
200               called A::foo
201               called D::foo
202               called B::foo
203
204       and omit the second call to "A::foo" (since it would not be distinct
205       from the first call to "A::foo").
206
207       Note that you can also use:
208
209               $self->NEXT::DISTINCT::ACTUAL::method();
210
211       or:
212
213               $self->NEXT::ACTUAL::DISTINCT::method();
214
215       to get both unique invocation and exception-on-failure.
216
217       Note that, for historical compatibility, you can also use
218       "NEXT::UNSEEN" instead of "NEXT::DISTINCT".
219
220   Invoking all versions of a method with a single call
221       Yet another pseudo-class that "NEXT" provides is "EVERY".  Its
222       behaviour is considerably simpler than that of the "NEXT" family.  A
223       call to:
224
225               $obj->EVERY::foo();
226
227       calls every method named "foo" that the object in $obj has inherited.
228       That is:
229
230               use NEXT;
231
232               package A; @ISA = qw(B D X);
233               sub foo { print "A::foo " }
234
235               package B; @ISA = qw(D X);
236               sub foo { print "B::foo " }
237
238               package X; @ISA = qw(D);
239               sub foo { print "X::foo " }
240
241               package D;
242               sub foo { print "D::foo " }
243
244               package main;
245
246               my $obj = bless {}, 'A';
247               $obj->EVERY::foo();        # prints" A::foo B::foo X::foo D::foo
248
249       Prefixing a method call with "EVERY::" causes every method in the
250       object's hierarchy with that name to be invoked. As the above example
251       illustrates, they are not called in Perl's usual "left-most-depth-
252       first" order. Instead, they are called "breadth-first-dependency-wise".
253
254       That means that the inheritance tree of the object is traversed
255       breadth-first and the resulting order of classes is used as the
256       sequence in which methods are called. However, that sequence is
257       modified by imposing a rule that the appropriate method of a derived
258       class must be called before the same method of any ancestral class.
259       That's why, in the above example, "X::foo" is called before "D::foo",
260       even though "D" comes before "X" in @B::ISA.
261
262       In general, there's no need to worry about the order of calls. They
263       will be left-to-right, breadth-first, most-derived-first. This works
264       perfectly for most inherited methods (including destructors), but is
265       inappropriate for some kinds of methods (such as constructors, cloners,
266       debuggers, and initializers) where it's more appropriate that the
267       least-derived methods be called first (as more-derived methods may rely
268       on the behaviour of their "ancestors"). In that case, instead of using
269       the "EVERY" pseudo-class:
270
271               $obj->EVERY::foo();        # prints" A::foo B::foo X::foo D::foo
272
273       you can use the "EVERY::LAST" pseudo-class:
274
275               $obj->EVERY::LAST::foo();  # prints" D::foo X::foo B::foo A::foo
276
277       which reverses the order of method call.
278
279       Whichever version is used, the actual methods are called in the same
280       context (list, scalar, or void) as the original call via "EVERY", and
281       return:
282
283       •   A hash of array references in list context. Each entry of the hash
284           has the fully qualified method name as its key and a reference to
285           an array containing the method's list-context return values as its
286           value.
287
288       •   A reference to a hash of scalar values in scalar context. Each
289           entry of the hash has the fully qualified method name as its key
290           and the method's scalar-context return values as its value.
291
292       •   Nothing in void context (obviously).
293
294   Using "EVERY" methods
295       The typical way to use an "EVERY" call is to wrap it in another base
296       method, that all classes inherit. For example, to ensure that every
297       destructor an object inherits is actually called (as opposed to just
298       the left-most-depth-first-est one):
299
300               package Base;
301               sub DESTROY { $_[0]->EVERY::Destroy }
302
303               package Derived1;
304               use base 'Base';
305               sub Destroy {...}
306
307               package Derived2;
308               use base 'Base', 'Derived1';
309               sub Destroy {...}
310
311       et cetera. Every derived class than needs its own clean-up behaviour
312       simply adds its own "Destroy" method (not a "DESTROY" method), which
313       the call to "EVERY::LAST::Destroy" in the inherited destructor then
314       correctly picks up.
315
316       Likewise, to create a class hierarchy in which every initializer
317       inherited by a new object is invoked:
318
319               package Base;
320               sub new {
321                       my ($class, %args) = @_;
322                       my $obj = bless {}, $class;
323                       $obj->EVERY::LAST::Init(\%args);
324               }
325
326               package Derived1;
327               use base 'Base';
328               sub Init {
329                       my ($argsref) = @_;
330                       ...
331               }
332
333               package Derived2;
334               use base 'Base', 'Derived1';
335               sub Init {
336                       my ($argsref) = @_;
337                       ...
338               }
339
340       et cetera. Every derived class than needs some additional
341       initialization behaviour simply adds its own "Init" method (not a "new"
342       method), which the call to "EVERY::LAST::Init" in the inherited
343       constructor then correctly picks up.
344

SEE ALSO

346       mro (in particular next::method
347       <https://metacpan.org/pod/mro#next::method>), which has been a core
348       module since Perl 5.9.5.
349

AUTHOR

351       Damian Conway (damian@conway.org)
352

BUGS AND IRRITATIONS

354       Because it's a module, not an integral part of the interpreter, "NEXT"
355       has to guess where the surrounding call was found in the method look-up
356       sequence. In the presence of diamond inheritance patterns it
357       occasionally guesses wrong.
358
359       It's also too slow (despite caching).
360
361       Comment, suggestions, and patches welcome.
362
364        Copyright (c) 2000-2001, Damian Conway. All Rights Reserved.
365        This module is free software. It may be used, redistributed
366           and/or modified under the same terms as Perl itself.
367
368
369
370perl v5.36.0                      2022-08-30                         NEXT(3pm)
Impressum