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