#!perl use strict; use warnings; use lib qw( t t/lib ./lib ../lib ); package Base; use base qw( Package::Data::Inheritable ); BEGIN { Base->pkg_inheritable('$staticData1' => 1); # overidden in Derived Base->pkg_inheritable('$staticData2' => 2); # untouched in Derived Base->pkg_inheritable('$staticData3' => 3); # reassigned in Derived } sub new { my $class = ref $_[0] || $_[0]; bless { instanceData1 => 1, }, $class; } sub staticMethodA { print "- staticMethodA\n"; } sub staticMethodB { print "- Base staticMethodB $staticData1\n"; } sub staticDump { print "Base.staticDump()\n", "\tstaticData1: $staticData1\n", "\tstaticData2: $staticData2\n", "\tstaticData3: $staticData3\n"; } sub instanceDump { my $self = shift; print "Base.instanceDump() ", ref $self, "\n", "\tstaticData1: $staticData1\n", "\tinstanceData1: $self->{instanceData1}\n"; } ######################################## package Derived; use base qw( Base ); BEGIN { inherit Base; Derived->pkg_inheritable('$staticData1' => '111'); }; $staticData3 = "333"; sub new { my $class = ref $_[0] || $_[0]; bless { %{ $class->SUPER::new(@_) }, instanceData2 => "222", }, $class; } sub staticMethodB { print "- Derived staticMethodB $staticData1\n"; } sub staticDumpB { print "Derived.staticDumpB()\n", "\tstaticData1: $staticData1\n", "\tstaticData2: $staticData2\n", "\tstaticData3: $staticData3\n"; } sub instanceDumpB { my $self = shift; print "Derived.instanceDumpB() ", ref($self), "\n", "\tstaticData1: $staticData1\n"; } ######################################## my $base = Base->new(); my $derived = Derived->new(); # static methods defined in a base class always see the base class data # even when invoked on a derived class $base->staticMethodA(); $derived->staticMethodA(); $base->staticMethodB(); $derived->staticMethodB(); $base->staticDump(); $base->instanceDump(); $derived->staticDump(); print "\n"; # even *instance* methods defined in a base class see the base class data # even when invoked on a derived class # *furthermore*, they don't see the derived instance data either $derived->instanceDump(); $derived->staticDumpB(); $derived->instanceDumpB();