#!/usr/bin/perl -wT
package StaticMammal;
use strict;
use warnings;
sub new {
my ($class) = @_;
my $new_critter = bless {}, $class;
return $new_critter;
}
sub walk {
my ($self) = @_;
print "A " . ref( $self ) . " walks " . $self->walks_how() . "\n";
return;
}
sub talk {
my ($self) = @_;
print "A " . ref( $self ) . " says " . $self->talks_how() . "\n";
return;
}
sub walks_how {
return q(ponderously);
}
sub talks_how {
return q(Grrr);
}
1;
__END__
####
#!/usr/bin/perl -wT
package DynamicMammals;
use strict;
use warnings;
use lib '.';
my %style_of
= (
Cat => {
talks => q(meow),
walks => q(in beauty, like the night),
},
Dog => {
talks => q(woof),
},
FrankenMammal => {
## empty hash
},
);
my $package_str = q();
foreach my $mammal (keys %style_of) {
$package_str .= qq(
package Dynamic$mammal;
use base qw(StaticMammal);
);
my $action_href = $style_of{ $mammal };
foreach my $action (keys %$action_href) {
$package_str
.= sprintf q(
sub %s_how {
return q(%s);
}
), $action, $action_href->{ $action};
}
}
eval $package_str;
if (my $msg = $@) {
die "Eval error: $msg\nwhile trying to eval:\n$package_str";
}
1;
__END__
##
##
#!/usr/bin/perl -wT
use strict;
use warnings;
use lib '.';
use DynamicMammals;
my $felix = DynamicCat->new();
my $spot = DynamicDog->new();
my $thing = DynamicFrankenMammal->new();
foreach my $critter ($felix, $spot, $thing) {
$critter->walk();
$critter->talk();
}
__END__