my $_global; sub _self_or_create { my $self = shift; return $self if (ref $self and $self->isa(__PACKAGE__)) $_global ||= __PACKAGE__->_new(); return $_global; # assume $self eq __PACKAGE__ or something derived from it? }