Submethods
A submethod is declared like
a
method, but behaves more like a
sub in that it’s not inherited
but can be pulled in with a role. Submethods are useful for
inheriting interface without inheriting implementation—you can
override
a method from a parent class without inflicting the changes on any
child classes.
The Frogstar::A class defines a set of methods and
attributes for the Frogstar Scout robots:
class Frogstar::A {
has Laser::Beam $.beam;
has Antimatter::Ray $.ray;
has Electron::Ram $.ram;
. . .
method zap ($target) { $.beam.fire($target); }
method shoot ($target) { $.ray.fire($target); }
method smash ($target) { $.ram.fire($target); }
. . .
}In addition to methods for navigation, propulsion, etc., the Frogstar
Scouts boast an astounding number of destructive methods (as is to be
expected). The Frogstar::B class inherits all of
Frogstar::A’s methods and
attributes, and also adds its own additional weaponry. Instead of
defining a new method for the Zenon Emitter, the Frogstar Scout B
overrides the smash method to use the emitter:
class Frogstar::B is Frogstar::A {
has Zenon::Emitter $.emitter;
submethod smash ($target) { $.emitter.fire($target); }
}It still smashes the target, only faster, as you might expect from a
newer model. Since the overridden method was declared as a submethod,
it has no effect on the Frogstar Scout C, which inherits from
Frogstar::B:
class Frogstar::C is Frogstar::B { . . . } . . . $fighter = Frogstar::C.new( . . . ); $fighter.smash($floor); # ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access