#!/usr/local/bin/perl -w use strict; package A; use vars qw(%DATA); %DATA=('name' => 'A name', 'data' => 'A data' ); sub new { my $class=shift; my $self={}; bless $self, $class; } sub init { my $self=shift; my $class=ref($self); $self->initData($class); # other initialization here } sub initData { my ($self, $class, $visited)=@_; $visited={} unless $visited; # First visit all the superclasses no strict 'refs'; foreach my $c (@{"${class}::ISA"}) { $self->initData($c, $visited); } # Now take my own %DATA hash if (!exists($visited->{$class})) { $self->copyData(%{"${class}::DATA"}); $visited->{$class}=1; } } sub copyData { my $self=shift; my %data=@_; $self->{$_}=$data{$_} foreach keys(%data); } #################### package B; use vars qw(@ISA %DATA); @ISA=qw(A); %DATA=('name' => 'B name'); 1;