package Bubba;
use strict;
use warnings;
our %Defaults = (
type => 'Gump',
);
sub new {
my $this = shift;
my $class = ref $this || $this;
my %parms = @_;
my $type = exists $parms{type} ? $parms{type} : $Defaults{type};
delete $parms{type};
if ($class eq __PACKAGE__) {
# if subclasses were in separate modules, we'd
# dynamically load here
$class .= "::$type";
return $class->new(%parms);
}
my $self = {};
bless $self, $class;
# do stuff with parms as the subclass
$self;
}
sub shout { print "Unobtainable shrimp. No subclass?\n" }
package Bubba::Gump;
use base 'Bubba';
sub shout { print "Boiled shrimp\n" }
package Bubba::Wump;
use base 'Bubba';
sub shout { print "Fried shrimp\n" }
1;
####
#!/usr/bin/perl -w
use strict;
use Bubba;
my $b = Bubba->new();
$b->shout;
my $g = Bubba->new(type => 'Wump');
$g->shout;
my $bg = Bubba::Gump->new();
$bg->shout;
my $bw = Bubba::Wump->new();
$bw->shout;
####
# ./summon_bubba.pl
Boiled shrimp
Fried shrimp
Boiled shrimp
Fried shrimp