package A; ... package A::a; use base 'A'; ... package A::b; use base 'A'; ... package B; use A; # A is abstract and contains 'factory' methods, so we # will actually use instances of A::a or A::b ... package C; use B; ... package D; use C; use XYZ; # not our code...something we installed ...