sub Helper { my ($object, $code, $defaults, @arguments) = @_; if (! $object->TaskIsDone()) { $code->(); } if (!@arguments) { @arguments = @$defaults; } return $object->common_task(@arguments); } sub DoTask1 { my ($object, @arguments) = @_; return $object->Helper( sub { $object->SetupTaskOne() }, [ qw(ARG1 ARG2 ARG3) ], @arguments); } sub DoTask2 { my ($object, @arguments) = @_; return $object->Helper( sub { $object->SetupTaskTwo() }, [ qw(ARG6 ARG2 ARG1 ARG5) ], @arguments); } (...) sub DoTask10 { my ($object, @arguments) = @_; return $object->Helper( sub { $object->DoTask(); $object->DoSomeMoreSetup(); }, [ qw(ARG3 ARG5 ARG7) ], @arguments); }