NAME
here::declare - easily declare compile time variables
VERSION
version 0.03
SYNOPSIS
use here::declare;
use const qw($ONE 1 $TWO 2);
use my [qw(x y z)] => [$ONE + $TWO, 4, 5];
use our '@foo' => [$x, $y, $z];
is equivalent to:
our ($ONE, $TWO);
BEGIN {
*ONE = \'1';
*TWO = \'2';
}
my ($x, $y, $z);
BEGIN {
($x, $y, $z) = ($ONE + $TWO, 4, 5);
}
our @foo;
BEGIN {
@foo = ($x, $y, $z);
}
without all that tedious typing.
USE STATEMENTS
all aspects of here::declare
must normally be imported using use ...;
statements.
without arguments, an initial use here::declare;
line creates all five pseudo-modules ( my our state const const2
). if you only want some, pass a list of those.
in the following examples, the use my
declaration will be used. its usage is equivalent to use our
and use state
.
a single argument with =
use my '$x = 1';
use my '($y, $z) = (2, 3)';
this is the simplest transform, which given an argument matching foo = bar
gets rewritten as:
my foo; BEGIN {foo = bar}
so the above becomes:
my $x; BEGIN {$x = 1}
my ($y, $z); BEGIN {($y, $z) = (2, 3)}
while this version looks the closest to perl's native variable declarations, it is unable to pass arguments that can not easily be written in a string.
list of name/value pairs
use my '$say' => sub {print @_, $/};
use my '@array' => [1, 2, 3], '%hash' => {a => 1, b => 2};
here an arbitrarily long list of name/value pairs is passed to the declarator.
if the name is a $scalar
then the corresponding value will be copied into the newly created variable at compile time. it is safe to pass any type of scalar as a value, and it will not be stringified. bareword
and -bareword
names will be interpreted as $bareword
which can cut down on the number of quotes you need to write (use my say => sub {...};
)
if the name is an @array
or %hash
the corresponding values must be ARRAY
or HASH
references, which will be dereferenced and copied into the new variables.
so the above becomes:
my $say; BEGIN {$say = here::fetch(1)}
my @array; BEGIN {@array = @{here::fetch(2)}}
my %hash; BEGIN {%hash = %{here::fetch(3)}}
where here::fetch
is a subroutine that returns the values passed into the declarator, which gets around needing to serialize the values.
[array of names] => list or array of values
use my [qw($x $y $z)] => 1, 2, 3;
use my [qw($foo @bar %baz)] => ['FOO', [qw(B A R)], {b => 'az'}];
this usage is exactly like the list of name/value pairs usage except the names and values are passed in separately. the names must be an array reference. the values can be an array reference or a list.
as a syntactic shortcut, the above two lines could also be written:
use my '($x, $y, $z)' => 1, 2, 3;
use my '($foo, @bar, %baz)' => 'FOO', [qw(B A R)], {b => 'az'};
which of course expands to something equivalent to:
my ($x, $y, $z);
BEGIN {$x = 1; $y = 2; $z = 3}
my ($foo, @bar, %baz);
BEGIN {$foo = 'FOO'; @bar = qw(B A R); %baz = (b => 'az')}
ignoring the complexities of here::fetch
const and const2
use const '$FOO' => 'BAR';
use const2 DEBUG => 1;
which expands to:
our $FOO; BEGIN {*FOO = \'BAR'}
sub DEBUG () {1} our $DEBUG; BEGIN {*DEBUG = \DEBUG}
these declarations only accept $scalar
, bareword
or -bareword
names (interchangeably), but otherwise the usage is similar to use my ...
the single argument syntax is not supported with these two declarations.
cleanup
you can remove the pseudo-modules manually:
no here::declare;
or let the declaration fall out of scope if B::Hooks::EndOfScope is installed:
{
use here::declare;
use my ...; # works
}
use my ...; # error
EXPORT
if you don't like the installation of pseudo-modules, you can pass use here::declare
a list of any of the pseudo-module names each containing at least one upper case character. this will cause that name to be exported into your namespace as a subroutine.
use here::declare 'MY';
use here MY [qw($x $y)] => [0, 0];
SEE ALSO
here::declare
is built on top of the " here " framework.
in writing this module, I was pushed by p5p to make the interface a bit closer to the native my
and our
keywords. I did this with Devel::Declare in Begin::Declare. Begin::Declare
is certainly closer in usage to the keywords, but the dependency on Devel::Declare
might prevent installation for some people. in addition, this module (despite using Filter::Util::Call
) is a little safer to use than Begin::Declare
since the use
statement required by this module more clearly delineates the scope of its actions.
AUTHOR
Eric Strom, <asg at cpan.org>
BUGS
please report any bugs or feature requests to bug-here at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=here. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
LICENSE AND COPYRIGHT
copyright 2011 Eric Strom.
this program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
see http://dev.perl.org/licenses/ for more information.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 302:
L<> starts or ends with whitespace