You can create a lexical variable in the class that gets incremented in the constructor and decremented in the destructor. A class closure method makes this value accessible from outside. Don't forget to call SUPER::new in child classes.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{ package Car;
my $count;
sub new {
my ($class, $name, $price) = @_;
my $self = {name => $name,
price => $price,
speed => 0};
say 'Object car being created:';
say "Name: $name";
say "Price: $price\n";
++$count;
return bless $self, $class
}
sub speed_up {
my ($self, $acc) = @_;
return $self->{speed} += $acc
}
sub slow_down {
my ($self, $acc) = @_;
return $self->{speed} -= $acc
}
sub DESTROY {
say 'Scrap!';
--$count
}
sub count {
return $count
}
}
{ package Car::GeneralMotors::Firebird;
use parent -norequire => 'Car';
sub new {
my ($class, $price) = @_;
$class->SUPER::new('General Motors Firebird', $price);
}
}
my @cars;
for (1 .. 10) {
push @cars, 'Car'->new('Peel P50', 176_000);
}
splice @cars, 0, 5;
say 'Car'->count;
say 'It works for subclasses, too:';
my $f = 'Car::GeneralMotors::Firebird'->new(200_000);
say 'Car'->count;
undef $f;
say 'Car'->count;
map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]