Yes, but you need something to call UNIVERSAL::VERSION. Usually, that something is Exporter. Proof:
# Module1.pm
# ==========
package Module1;
our $VERSION = '2.0';
1;
# Module2.pm
# ==========
package Module2;
use Exporter ();
our $VERSION = '2.0';
our @ISA = 'Exporter';
1;
# script.pl
# =========
BEGIN { print("Loading Module1...\n"); }
use Module1 '3.0';
BEGIN { print("Loaded.\n"); }
BEGIN { print("Loading Module2...\n"); }
use Module2 '3.0';
BEGIN { print("Loaded.\n"); }
output
======
Loading Module1...
Loaded.
Loading Module2...
Module2 3.0 required--this is only version 2.0 (Module2.pm) at script.
+pl line 6
BEGIN failed--compilation aborted at script.pl line 6.
Notice how the version passed to Module1 is completely ignored.
In writing this test, I also found errors in what I thought I knew.
1) *import = \&Exporter::import; doesn't work as well as I thought. My original Module2 gave a run-time error. It was:
package Module2;
use Exporter ();
our $VERSION = '2.0';
*import = \&Exporter::import;
1;
To fix without inheriting from Exporter, one needs to also import require_version:
package Module2;
use Exporter ();
our $VERSION = '2.0';
*import = \&Exporter::import;
*require_version = \&Exporter::require_version;
1;
2) I always thought use Module 'maj.min' would make sure the major version is the same as the one in $VERSION, yet use Module2 '1.0' doesn't fail.
|