Build one behavior by calling another package routine.

delegation-intro Delegation keeps reuse explicit by calling a helper package directly.

Delegation Intro

name
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";
  1. $name ← Rex

    21my $name→ Rex = "Rex"; #@name="Milo", "Nia"22my $sound = DogSound::label($nameRex);
  2. $name ← Rex

    13sub label {14    my ($name→ Rex) = @_;15    my $base = Speaker::base_label($nameRex);16    return "$base:woof";
  3. $name ← Rex

    6sub base_label {7    my ($name→ Rex) = @_;8    return "$nameRex:makes-sound";9}
  4. $base ← Rex:makes-sound

    14    my ($name) = @_;15    my $base→ Rex:makes-sound = Speaker::base_label($nameRex);16    return "$baseRex:makes-sound:woof";17}
  5. $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
  1. $name ← Milo

    21my $name→ Milo = "Milo";22my $sound = DogSound::label($nameMilo);
  2. $name ← Milo

    13sub label {14    my ($name→ Milo) = @_;15    my $base = Speaker::base_label($nameMilo);16    return "$base:woof";
  3. $name ← Milo

    6sub base_label {7    my ($name→ Milo) = @_;8    return "$nameMilo:makes-sound";9}
  4. $base ← Milo:makes-sound

    14    my ($name) = @_;15    my $base→ Milo:makes-sound = Speaker::base_label($nameMilo);16    return "$baseMilo:makes-sound:woof";17}
  5. $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
  1. $name ← Nia

    21my $name→ Nia = "Nia";22my $sound = DogSound::label($nameNia);
  2. $name ← Nia

    13sub label {14    my ($name→ Nia) = @_;15    my $base = Speaker::base_label($nameNia);16    return "$base:woof";
  3. $name ← Nia

    6sub base_label {7    my ($name→ Nia) = @_;8    return "$nameNia:makes-sound";9}
  4. $base ← Nia:makes-sound

    14    my ($name) = @_;15    my $base→ Nia:makes-sound = Speaker::base_label($nameNia);16    return "$baseNia:makes-sound:woof";17}
  5. $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