Awesome.pm: package Awesome; use strict; # static (class-wide) variable my $object_count = 0; # constructor -- a static method that creates and returns a new object sub new { my $class = shift; # remaining args are constructor parameters. # we'll assume it takes one param: name. this parameter gets saved in our new "object", a blessed hash ref my $self = {name => $_[0]}; bless($self,$class); $object_count++; # increment a static counter return $self; } # static method -- the first arg is assumed to be the class name (though it could still be called with an object) sub count_objects_created { shift; # discard class # remaining args are parameters return $object_count; } # instance method -- first arg is an object (though it can still be called (erroneously) as a static method) sub do_stuff { my $self = shift; # ... $self->{stuff} = 'done'; # set an instance variable } # accessor/mutator instance method -- run $obj->name() to read, $obj->name("newvalue") to write sub name { my $self = shift; if (@_) { $self->{name} = $_[0]; } return $self->{name}; } 1; # so the require or use succeeds Example use: #!/usr/bin/perl use strict; use Awesome; my $obj = Awesome->new("bob"); $obj->name("superbob"); $obj->{name} = "secret bob"; # direct access possible, but unadvisable my $n = Awesome->count_objects_created(); $obj->do_stuff();