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? } #### sub some_method { my $self = _self_or_create(shift); # ... } #### { my $obj = Vendor::Library->new(...); # code here } { my $obj = Vendor::Library->new(...); # different code here (I presume) }