package File_Entry { (has 3 routines, constructor & accessors): sub new([name,[rating]]); filename([name]) rating([rating]) } package File_Entries { use fields qw(__entries); #### our $pckg_vars = __PACKAGE__; sub new () { my $class=$_[0]; my $s = {}; # base class starts/nothing $s->{$pckg_vars} = {}; bless $s, ref($class) || $class; $s->_entries_init; return $s; } sub ratings ([index,[rating]) #r/w accessor sub filenames([index]) #r/o accessor sub _add_entry(\$) #adds entry of type File_Entry #### package Class2; our $pckg_vars = __PACKAGE__; sub new(){ my $class=$_[0]; my $s = "Base"->new(params).... my $s->{$pckg_vars} = {}; #'local' class var space bless $s,$class; return $s; ...} package Class3; our $pckg_vars => __PACKAGE__; sub new(){ my $class=shift; my $s = Class2->new(params)... my $s->{$pckg_vars} = {}; #class3 local vars bless $s,$class; return $s; ....} #### { package Entry_Display_In_Wins; use strict; our @ISA = qw(Entry_Ordering GUI_Glue); use base qw(Entry_Ordering); # and GUI_Glue, but base deficient use fields qw( __width __height __timer__ticked __timer__enabled); ... but then I get to "new" sub new($) ... my ($class,$args) = @_; my $s= PreviousClass->new($args); confess "Fatal: memory for object $pckg_vars " . "busy (in use by someone else).\n" if (defined $s->{$pckg_vars}); $s->{$pckg_vars} = {}; bless $s, $class; ... $s->{$pckg_vars}->{'__GUI_Glue'}= GUI_Glue->new(...); return $s;