in reply to Re^2: Howto "use" backward compability packages of new "feature"s
in thread Howto "use" backward compability packages of new "feature"s

What I said about keys applies to values and each as well. It's not a backward incompatible change, so no feature needs to be activated. Your code boils down to

use if $] < 5.012, 'Enumerators';

Prepending scripts with nine lines of code is not what I was hoping for.

That's because you're trying to write your code inside out. A less messy approach would be to include Enumerators unconditionally, and let it decide if it needs to override each or not. It's not a detail the module's user should worry about.

# use Enumerators -global; # use Enumerators qw( each ); # use Enumerators; package Enumerators; use Exporter qw( ); our @EXPORT = qw( each ); our @EXPORT_OK = qw( each ); sub import { my $class = shift; return if $[ >= 5.012; if ($_[0] eq '-global') { *CORE::GLOBAL::each = \&each; } else { goto &Exporter::import; } } sub each(\[@%]) { ... } 1;

(Trim out what you don't want.)

Note that this approach works for pragams too.

package stricter; sub import { require strict; strict->import; require warnings; warnings->import; } 1;

use stricter; does the same as use strict; use warnings;

Replies are listed 'Best First'.
Re^4: Howto "use" backward compability packages of new "feature"s
by LanX (Saint) on Aug 23, 2010 at 14:40 UTC
    Thanks a lot for the "stricter" example, the possibility to import pragmas is owesome.

    Do you know where this is documented?

    BTW: just found an "if pragma" which could be used for backwards compatibility!

      use if $] < 5.008, "utf8";

    Cheers Rolf

      Where what is documented, the run-time equivalent of use? In use.

      just found an "if pragma" which could be used for backwards compatibility!

      You found it at the top of the post to which you replied.

        > Where what is documented, the run-time equivalent of use? In use.

        Well it's documented for "MODULE"s, but is it evident that it's possible to call an "import" method on a pragma?

        There is no builtin "import" function.

        Hmm at least it's consistent, which is brilliant! :)

        >You found it at the top of the post to which you replied.

        nonsense, I oversaw it there! ;)

        Cheers Rolf

      just found an "if pragma" which could be used for backwards compatibility!
      Ah, but if.pm has backwards compatability issues itself - it first appeared in 5.6.2 Here's what I use if I want to use warnings, but still want the code to be able to run in 5.005 (without warnings enabled of course):
      BEGIN { $INC{"warnings.pm"} = 1 if $] < 5.006; } use strict; use warnings;
      Note that if you want to be able to do no warnings, you have to create a dummy sub warnings::unimport as well.

      I've no reason to assume if.pm cannot be installed in 5.005. I just don't want another module dependency for what I can do in a single statement myself.

        Thanx, very interesting. :)

        I'm quite enthusiastic about requiring and importing pragmas in a separate module like demonstrated in this example of use stricter

        Could you do me a favor and test it in your suite of old perl interpreters?

        I'm still not completely convinced...

        Cheers Rolf