package ClassOne; sub new { my ($class, %args) = @_; #... my $data = $class->load_a_bunch_of_data($arg{one}); return bless $data, $class; } use ClassThreeList; sub load_a_bunch_of_data { my ($class, $arg1) = @_; # load a bunch of data that only ClassOne cares about # ... # load a list of data that both ClassOne # and ClassTwo care about. my $item_list = ClassThreeList->load_where(objectlistid => $arg1); foreach my $item (@$item_list) { ### BEGIN CODE THAT I WANT TO SHARE ### $item->load_attr1_list; $item->load_attr2_list; $item->calculate_some_attribute. $item->etc; ### END CODE THAT I WANT TO SHARE ### } } # ClassTwo does not exist yet. #### package ClassOne; sub new { my ($class, %args) = @_; #... my $data = $class->load_a_bunch_of_data($arg{one}); return $data, $class; } use ClassThreeList; sub load_a_bunch_of_data { my ($class, $arg1) = @_; # load a bunch of data that only ClassOne cares about # ... # load a list of data that both ClassOne # and ClassTwo care about. my $item_list = ClassThreeList->load_where(objectlistid => $arg1); foreach my $item (@$item_list) { $class->shared_class_method_one( $item ); } } sub shared_class_method_one { my ($class, $item) = @_; $item->load_attr1_list; $item->load_attr2_list; $item->calculate_some_attribute. $item->etc; } package ClassTwo; use ClassOne; sub new { #... } sub new_method_that_needed_shared_code { my ($class, $arg1) = @_; my $item = ClassThree->load(objectid => $arg1); ClassOne->shared_class_method_one($item); ####### LINE IN QUESTION ######## }