#!/usr/bin/perl -w use strict; {package LivingCreature; sub named { my $class = shift; my $name = shift; bless \$name, $class; } sub name { my $self = shift; #is self an object or a class ref $self ? $$self : "unnamed $self"; } sub speak { my $self = shift; my $sound = shift; if($self eq '') { } print $self->name ." goes ". $self->sound($sound) .".\n"; } } {package Person; use base qw/LivingCreature/; sub sound { my $self = shift; my $sound = shift; $sound ? $sound : 'Hmmm'; } } {package Animal; use base qw/LivingCreature/; } {package Horse; use base qw/Animal/; sub sound {'neiggghhhh'}; } {package Mouse; use base qw/Animal/; sub sound {'Meep'}; #overwrite speak sub speak { my $class = shift; $class->SUPER::speak(@_); print "[But you can barely hear it]\n"; } } my $p1 = Person->named('Edgar'); my $h1 = Horse->named('Mr. Ed'); my $p2 = 'Person'; $h1->speak; $p1->speak; $p1->speak('Hello World :D'); $p2->speak; $p2->name;