use Foo;
use Foo ':modern';
####
package Foo;
use strict;
use warnings;
use feature 'say';
use parent 'Exporter';
my $MODE = 0;
my %const;
BEGIN {
%const = (
ABC => 'abc',
XYZ => 'xyz',
# etc.
# longer list
)
}
use constant \%const;
our @EXPORT_OK = keys %const;
sub import {
my ( $self, $flag ) = @_;
if ( defined $flag and $flag eq ':modern' ) {
$MODE = 1;
Foo-> export_to_level( 1, 'Foo', keys %const );
no warnings 'redefine';
*Foo::m2 = \&Foo::Modern::m2;
# etc.
# longer list
}
}
sub new { my $class = shift; bless {}, $class }
sub m1 { say $MODE ? 'modern 1' : 'classic 1' }
sub m2 { say 'classic 2' }
package Foo::Modern {
sub m2 { say 'modern 2' }
};
1;
####
use strict;
use warnings;
use feature 'say';
use lib '.';
use Foo ':modern';
my $obj = Foo->new;
$obj->m1;
$obj->m2;
say ABC;