package Lookup; sub new { # gets some config file }; sub get { warn 'You should implement this method!'; } sub set { warn 'You should implement this method!'; } package Lookup::Remote; use base 'Lookup'; sub get { ... }; sub set { ... }; package main; use User; User->init({ source => 'Lookup::Remote', }); my $user = User->new({ id => 1234, }); #### package User; sub new { ... $self->{'source'} = $main::USER_LOOKUP_SOURCE; ... } package main; use User; our $USER_LOOKUP_SOURCE = LookupFactory->new('Remote'); my $user = User->new({ id => 1234, });