#!/usr/bin/perl use strict; use warnings; use feature qw/say/; use vars qw/$VERSION/; $VERSION = 0.01; UNITCHECK { sub _running_under_docreader { !! $ENV{PERLDOC} } sub _running_under_tester { !! $ENV{HARNESS_ACTIVE} } sub _running_as_app { defined scalar caller } my $method = do { if( _running_under_docreader() ) { 'doc' } # reading docs elsif( _running_under_tester() ) { 'test' } # testing elsif( _running_as_app() ) { 'run' } # running the application else { undef } # everything else }; __PACKAGE__->$method(@ARGV) if defined $method; } sub run { say $VERSION; } $ ./foo.pl Use of uninitialized value $VERSION in say at ./foo.pl line 36.