package Data; sub new { ... } sub other { ... } #no "process" package package My::ProcessA; BEGIN { #reverse inheritence code into Data } sub processA { my ( $data, @opts ) = @_; #$data is a Data instance\ ... return new Data( $stuff ); } package My::ProcessB; BEGIN { #reverse inheritence code into Data } sub processB { my ( $data, @opts ) = @_; #$data is a Data instance ... return new Data( $stuff ); } # In code: use Data; use My::ProcessA; (Data::processA appears, magically!) use My::ProcessB; (Data::processB appears, magically!) my $data = new Data ( $data_from_file ); # Now possible, woohoo! my $processed = $data ->processA( @Aopts ) ->processB( @Bopts ); #### my $newdata = $data->processA( @opts ); #scalar $data->processA( @opts ); #void