NAME
Devel::Pragma - helper functions for developers of lexical pragmas
SYNOPSIS
package MyPragma;
use Devel::Pragma qw(my_hints ccstash new_scope);
sub import {
my $hints = my_hints; # lexically-scoped %^H
my $caller = ccstash(); # currently-compiling stash
$hints->{MyPragma} = 1;
if (new_scope) {
...
}
}
DESCRIPTION
This module provides helper functions for developers of lexical pragmas. These can be used both in older versions of perl (from 5.6.0), which have limited support for lexical pragmas, and in the most recent versions, which have improved support.
EXPORTS
Devel::Pragma exports the following functions on demand. They can all be imported at once by using the :all
tag. e.g.
use Devel::Pragma qw(:all);
my_hints
Until perl change #33311, which isn't currently available in any stable perl release, %^H is dynamically-scoped, rather than lexically-scoped. This means that values set in %^H are visible in modules loaded by use
. This makes pragmas leak from the scope in which they're meant to be enabled into scopes in which they're not. my_hints
fixes that by making %^H lexically scoped i.e. it prevents %^H leaking across file boundaries.
my_hints
installs versions of perl's require
and do EXPR
builtins in the currently-compiling scope which clear %^H before they execute and restore the previous %^H afterwards. Thus it can be thought of a lexically-scoped backport of change #33311.
Note that my_hints
also sets the $^H bit that "localizes" (or in this case "lexicalizes") %^H.
The return value is a reference to %^H.
new_scope
This function returns true if the currently-compiling scope differs from the scope being compiled the last time new_scope
was called. Subsequent calls will return false while the same scope is being compiled.
ccstash
This returns the name of the currently compiling stash. It can be used as a replacement for the scalar form of caller
to provide the name of the package in which use MyPragma
is called, but unlike caller
it returns the same value regardless of the number of intervening calls before MyPragma::import
is reached.
e.g. given a pragma:
package MySuperPragma;
use Devel::Hints qw(ccstash);
sub import {
my ($class, %options) = @_;
my $caller = ccstash();
no strict 'refs';
*{"$caller\::whatever"} = ... ;
}
and a subclass:
package MySubPragma
use base qw(MySuperPragma);
sub import {
my ($class, %options) = @_;
$class->SUPER::import(...);
}
and a script that uses the subclass:
#!/usr/bin/env perl
use MySubPragma;
- the ccstash
call in MySuperPragma::import
returns the name of the package that's being compiled when the call to MySuperPragma::import
(via MySubPragma::import
) takes place i.e. main
in this case.
VERSION
0.11
SEE ALSO
http://tinyurl.com/45pwzo
AUTHOR
chocolateboy <chocolate.boy@email.com>
COPYRIGHT AND LICENSE
Copyright (C) 2008 by chocolateboy
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.