Managing Class Data
Problem
You need a method to be called on behalf of the whole class, not just on one object. This might be a procedural request, or it might be a global data attribute shared by all instances of the class.
Solution
Instead of expecting a reference as their first argument as object
methods do,
class methods expect a string containing name of the class. Class
methods access package data, not object data, as in the
population method shown here:
package Person;
$Body_Count = 0;
sub population { return $Body_Count }
sub new { # constructor
$Body_Count++;
return bless({}, shift);
}
sub DESTROY { --$BodyCount } # destructor
# later, the user can say this:
package main;
for (1..10) { push @people, Person->new }
printf "There are %d people alive.\n", Person->population();
There are 10 people alive.Discussion
Normally, each object has its own complete state stored within itself. The value of a data attribute in one object is unrelated to the value that attribute might have in another instance of the same class. For example, setting her gender here does nothing to his gender, because they are different objects with distinct states:
$him = Person->new();
$him->gender("male");
$her = Person->new();
$her->gender("female");Imagine a classwide attribute where changing the attribute for one instance changes it for all of them. Just as some programmers prefer capitalized global variables, some prefer uppercase names when the method affects class data instead of instance data. Here’s ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access