package Base; use strict; use warnings; use fields qw( _f ); sub new { my Base $self = shift; if ( !ref $self ) { $self = fields::new( $self ); } $self->{_f} = 'base'; return $self; } sub base { my Base $self = shift; $self->{_f}; } sub set_base { my Base $self = shift; $self->{_f} = shift; } 1; #### package Derived; use strict; use warnings; use base 'Base'; use fields qw( _f ); sub new { my $class = shift; my Derived $self = fields::new( $class ); $self->SUPER::new(); $self->{_f} = 'derived'; return $self; } sub derived { my Derived $self = shift; $self->{_f}; } 1; #### #!/usr/bin/perl use strict; use warnings; use Test::More tests => 4; use Derived; my Derived $obj = Derived->new(); is( $obj->base(), 'base', 'Base::_f eq base' ); is( $obj->derived(), 'derived', 'Derived::_f eq derived' ); diag( 'Setting Base::_f to base2' ); $obj->set_base( 'base2' ); is( $obj->base(), 'base2', 'Base::_f eq base2' ); is( $obj->derived(), 'derived', 'Derived::_f still eq derived' ); 1; #### sub PKG() { __PACKAGE__ } ... $self->{PKG.'.foo'} = 42;