Challenge 3: Extend with SUPER:: — Possible Solution ==================================================================== package Animal; sub new { my ($class, $name) = @_; return bless { name => $name }, $class; } sub speak { my $self = shift; return "$self->{name} makes a sound"; } package Dog; our @ISA = ('Animal'); sub speak { my $self = shift; return "$self->{name} says Woof!"; } package LoudDog; our @ISA = ('Dog'); sub speak { my $self = shift; my $base = $self->SUPER::speak(); return "$base (LOUDLY)"; } package main; use strict; use warnings; use feature 'say'; my $dog = LoudDog->new("Rex"); say $dog->speak(); Output: Rex says Woof! (LOUDLY) WHY THIS WORKS AS AN ANSWER ------------------------------ Animal and Dog are reused completely unchanged from the chapter's own worked example — Dog's speak() already overrides Animal's, per the chapter's own explanation of method resolution walking @ISA. package LoudDog; our @ISA = ('Dog'); reuses the chapter's own @ISA inheritance syntax, this time chaining a THIRD level — LoudDog inherits from Dog, which itself inherits from Animal — demonstrating that @ISA chains work through multiple levels, not just one. $self->SUPER::speak(); reuses the chapter's own SUPER:: syntax exactly. Critically, per the chapter's own explanation, SUPER:: resolves relative to the CURRENT package (LoudDog), so it calls Dog's speak() — the nearest parent's version — not Animal's, even though Animal also has a speak(). This is what returns "Rex says Woof!" as $base, rather than "Rex makes a sound". return "$base (LOUDLY)"; then extends rather than replaces that inherited behavior, reusing string interpolation (Course 1, Chapter 2) to append the extra text — precisely the "extending, rather than fully replacing, inherited behavior" use case the chapter names SUPER:: as being for.