package A; sub new { my $pkg = shift; bless {}, $pkg; } sub do_something { my $self = shift; my $n = $self->x() + $self->y(); print "something is $n\n"; } sub x { die "subclass must override x\n" } sub y { die "subclass must override y\n" } package B; @ISA = (A); sub x { 42 } sub y { 47 } package main; my $object = new B(); $object->do_something; # A::do_something invokes B::x and B::y #### package A; sub new { my $pkg = shift; my $self = bless {}, $pkg; $self->init(); } sub init { die "subclass must override init()\n" } sub do_something { my $self = shift; my $n = $self->{x} + $self->{y}; print "something is $n\n"; } package B; @ISA = (A); sub init { my $self = shift; $self->{x} = 42; $self->{y} = 47; } package main; my $object = new B(); $object->do_something(); # A::do_something reaches into the bag, and pulls out # numbers that B::init provided