in reply to OOP By Any Other Name

You are using two techniques. I don't know which you are asking about.

By the way, why create %internal at all?

sub new_counter { my ($start) = @_; my $count = $start; return { add => sub { my ($value) = @_; $count += $value; }, get => sub { return $count; }, }; }
Or even
sub new_counter { my ($count) = @_; ... }