# User doesn't mind if it is local or remote, he wants the data package Lookup; ... sub is_user_in_cache { ... } sub get_user_data { warn 'You should implement this method!'; } ... package Lookup::Remote; use base 'Lookup'; sub get_user_data { ... } ... package main; use Lookup::Remote; my $lookup = Lookup->new({ remote_uri => $uri, }); use User; # Tell User class the lookup method it will use. User->set_lookup($lookup); my $user = User->new({ id => 1234, });