BEGIN { package Foo ; use strict ; use warnings ; sub new { my $class = shift ; my $this = { _var => 1, } ; bless $this, $class ; } sub task { # Long operation task Foo ~ 2 seconds my $this = shift ; print "Starting task Foo for $_[0]\n" ; sleep(2) ; ++$this->{ _var } ; print "Finished task Foo for $_[0]\n" ; } package Bar ; use strict ; use warnings ; sub new { my $class = shift ; # This is not very realistic code. # here it is just used as an # example to create an object that # contains a nested object my $this = { _var => 1, } ; $this->{ nestedFoo } = $_[0] ; bless $this, $class ; } sub task { # Long operation task Bar ~ 6 seconds my $this = shift ; print "Starting task Bar for $_[0]\n" ; sleep(6) ; ++$this->{ _var } ; print "Finished task Bar for $_[0]\n" ; } }