Package-Based Object Patterns
Delegation Intro
Build one behavior by calling another package routine.
delegation-intro
Delegation keeps reuse explicit by calling a helper package directly.
Delegation Intro
delegation_intro.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
package Speaker;
sub base_label {
my ($name) = @_;
return "$name:makes-sound";
}
package DogSound;
sub label {
my ($name) = @_;
my $base = Speaker::base_label($name);
return "$base:woof";
}
package main;
my $name = "Rex";
my $sound = DogSound::label($name);
print "name=$name\n";
print "sound=$sound\n";
use strict;
use warnings;
package Speaker;
sub base_label {
my ($name) = @_;
return "$name:makes-sound";
}
package DogSound;
sub label {
my ($name) = @_;
my $base = Speaker::base_label($name);
return "$base:woof";
}
package main;
my $name = "Milo";
my $sound = DogSound::label($name);
print "name=$name\n";
print "sound=$sound\n";
use strict;
use warnings;
package Speaker;
sub base_label {
my ($name) = @_;
return "$name:makes-sound";
}
package DogSound;
sub label {
my ($name) = @_;
my $base = Speaker::base_label($name);
return "$base:woof";
}
package main;
my $name = "Nia";
my $sound = DogSound::label($name);
print "name=$name\n";
print "sound=$sound\n";
$name ← Rex
21my $name→ Rex = "Rex"; #@name="Milo", "Nia"22my $sound = DogSound::label($nameRex);$name ← Rex
13sub label {14 my ($name→ Rex) = @_;15 my $base = Speaker::base_label($nameRex);16 return "$base:woof";$name ← Rex
6sub base_label {7 my ($name→ Rex) = @_;8 return "$nameRex:makes-sound";9}$base ← Rex:makes-sound
14 my ($name) = @_;15 my $base→ Rex:makes-sound = Speaker::base_label($nameRex);16 return "$baseRex:makes-sound:woof";17}$sound ← Rex:makes-sound:woof
21my $name = "Rex"; #@name="Milo", "Nia"22my $sound→ Rex:makes-sound:woof = DogSound::label($nameRex);2324print "name=$nameRex\n";25print "sound=$soundRex:makes-sound:woof\n";outputname=Rex sound=Rex:makes-sound:woof
$name ← Milo
21my $name→ Milo = "Milo";22my $sound = DogSound::label($nameMilo);$name ← Milo
13sub label {14 my ($name→ Milo) = @_;15 my $base = Speaker::base_label($nameMilo);16 return "$base:woof";$name ← Milo
6sub base_label {7 my ($name→ Milo) = @_;8 return "$nameMilo:makes-sound";9}$base ← Milo:makes-sound
14 my ($name) = @_;15 my $base→ Milo:makes-sound = Speaker::base_label($nameMilo);16 return "$baseMilo:makes-sound:woof";17}$sound ← Milo:makes-sound:woof
21my $name = "Milo";22my $sound→ Milo:makes-sound:woof = DogSound::label($nameMilo);2324print "name=$nameMilo\n";25print "sound=$soundMilo:makes-sound:woof\n";outputname=Milo sound=Milo:makes-sound:woof
$name ← Nia
21my $name→ Nia = "Nia";22my $sound = DogSound::label($nameNia);$name ← Nia
13sub label {14 my ($name→ Nia) = @_;15 my $base = Speaker::base_label($nameNia);16 return "$base:woof";$name ← Nia
6sub base_label {7 my ($name→ Nia) = @_;8 return "$nameNia:makes-sound";9}$base ← Nia:makes-sound
14 my ($name) = @_;15 my $base→ Nia:makes-sound = Speaker::base_label($nameNia);16 return "$baseNia:makes-sound:woof";17}$sound ← Nia:makes-sound:woof
21my $name = "Nia";22my $sound→ Nia:makes-sound:woof = DogSound::label($nameNia);2324print "name=$nameNia\n";25print "sound=$soundNia:makes-sound:woof\n";outputname=Nia sound=Nia:makes-sound:woof