use warnings; use strict; package Config { sub new { my ($class,%args) = @_; my $self = {}; # code to read $args{config_file} into $self return bless $self, $class; } } package Object { sub new { my ($class,%args) = @_; my $self = _parse_data_with_config($args{config},$args{data}); return bless $self, $class; } sub _parse_data_with_config { my ($config, $data) = @_; my $self = {}; # complex code to build $self from $data using $config return $self; } # ... } my $config = Config->new( config_file => "file.xml" ); my $obj1 = Object->new( config => $config, data => { foo=>123 } ); my $obj2 = Object->new( config => $config, data => { bar=>456 } );