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); # uses the Electron::Ram |