package MyApp { use Moo; has cgi => (is => 'ro'); has database => (is => 'ro'); has session => (is => 'ro'); sub do_something { my $self = shift; $self->databsse->foo(...); $self->cgi->bar(...); my $foo = $self->another_subroutine($somevar, $othervar); return $self->final_result($foo); } sub another_subroutine { my $self = shift; my ($somevar, $othervar) = @_; return $self->database->baz($self->cgi, $somevar, $othervar); } sub final_result { my $self = shift; my ($foo) = @_; my $result = $self->cgi + $self->session + $foo; return $result; } } #### package MyApp { ...; # all that stuff above has article_class => (is => 'ro', default => 'MyApp::Article'); sub create_article_object { my $self = shift; return $self->article_class->new( cgi => $self->cgi, database => $self->database, session => $self->session, @_ ); } sub get_home_page { my $self = shift; return $self->create_article_object(identifier => 1); } sub get_contact_page { my $self = shift; return $self->create_article_object(identifier => 2); } } package MyApp::Article { use Moo; has identifier => (is => 'ro'); has cgi => (is => 'ro'); has database => (is => 'ro'); has session => (is => 'ro'); ...; }