package MyPackage; our $global=0; sub global { shift; $global=$_[0] if @_; $global; } sub instance { my $this=shift; if (@_) { $this->{instance}=$_[0]; ++$global; } $instance; } sub new { my $package=shift; bless {},$package; } } package main; my $package = new MyPackage(); #main *doesn't* know what vars are per-class or which are per-instance. # that's an implementation detail the caller doesn't know about # so all calls are called through method calls. $package->instance(1.7); print "vars created = ",$package->global; ... # reset MyPackage counter to globally reset counter for all users # (not normal used; be available for better user control of counting... $package->global(0); ...