sub alpha { my $self = shift; my $condition = 1; # always return $self->_internal_sub($condition); } sub beta { my $self = shift; my $gamma = get_gamma_somewhere(); my $condition = $self->{baz} eq $gamma; return $self->_internal_sub($condition); } sub _internal_sub { my $self = shift; my $condition = shift; ... foreach ... if ... if ... if ... push @foo, [ @bar ] if $condition; } } } else { push @foo, [ @bar ] if $condition; } } push @foo, [ @bar ] if $condition; return \@foo; }