$ perl -Mstrict -Mwarnings -le ' package MyDir::Class; # An instance method sub id { my $self = shift; return $self->{id}; } # Anonymous block: code outside this block cannot see %instance_count { my %instance_count; # Constructor: a class method sub new { my ($class, $args_ref) = @_; ++$instance_count{$class}; return bless $args_ref => $class; } # Destructor: an instance method sub DESTROY { my $self = shift; --$instance_count{ref $self}; return; } # Another class method sub get_instance_count { my $class = shift; return $instance_count{$class} || 0; } } package MyDir::Class::SubClass; use base qw{MyDir::Class}; # no methods: all functionality is inherited package main; sub print_all_instance_counts { print "MyDir::Class instances: ", MyDir::Class::->get_instance_count(); print "MyDir::Class::SubClass instances: ", MyDir::Class::SubClass::->get_instance_count(); } # Starting counts print "*** Counts before any objects are created ***"; print_all_instance_counts(); # Create several objects my @objs = map { MyDir::Class::->new({id => $_}) } "A" .. "D"; my @obj_subs = map { MyDir::Class::SubClass::->new({id => $_}) } "W" .. "Z"; print "*** Counts after initial objects are created ***"; print_all_instance_counts(); # Destroy some objects undef $objs[-1]; pop @obj_subs; splice @obj_subs, 1, 1; shift @obj_subs; print "*** Counts after some objects are destroyed ***"; print_all_instance_counts(); ' *** Counts before any objects are created *** MyDir::Class instances: 0 MyDir::Class::SubClass instances: 0 *** Counts after initial objects are created *** MyDir::Class instances: 4 MyDir::Class::SubClass instances: 4 *** Counts after some objects are destroyed *** MyDir::Class instances: 3 MyDir::Class::SubClass instances: 1