NAME

Constant::FromGlobal - declare constant(s) with value from global or environment variable

SYNOPSIS

package Foo;

use Constant::FromGlobal qw(DEBUG);

sub foo {
    # to enable debug, set $Foo::DEBUG=1 before loading Foo
    warn "lalala" if DEBUG:
}

DESCRIPTION

This module lets you define constants that either take their values from global variables, or from environment variables. The constants are function-style constants, like those created using the constant pragma.

Here's a minimal example showing how to set a constant from a global variable:

our $DEBUG;
BEGIN {
    $DEBUG = 1;
}
use Constant::FromGlobal qw/ DEBUG /;

You might wonder why you might want to do that? A better example is where a module sets a constant from a global variable in its package, but you can set that variable before using the module. First, here's the module:

package Foobar;
use Constant::FromGlobal LOGLEVEL => { default => 0 };

Then elsewhere you can write something like this:

BEGIN {
  $Foobar::LOGLEVEL = 3;
}
use Foobar;

Environment variables

By default Constant::FromGlobal will only look at the relevant global variable. If you pass the env option, then it will also look for an appropriately named environment variable:

use Constant::FromGlobal DEBUG => { env => 1, default => 0 };

Note that you can also set a default value, which will be used if neither a global variable nor environment variable was found.

METHODS

import

This routine takes an optional hash of options for all constants, followed by an option list (see Data::OptList) of constant names.

For example:

use Constant::FromGlobal { env => 1 }, "DSN", MAX_FOO => { int => 1, default => 3 };

is the same as

use Constant::FromGlobal DSN => { env => 1 }, MAX_FOO => { int => 1, default => 3, env => 1 };

which will define two constants, DSN and MAX_FOO. DSN is a string and MAX_FOO is an integer. Both will take their values from $Foo::DSN if defined or $ENV{FOO_DSN} as a fallback.

Note: if you define constants in the main namespace, version 0.01 of this module looked for environment variables prefixed with MAIN_. From version 0.02 onwards, you don't need the MAIN_ prefix.

There are three types you can specify for constants:

  • int - constains the constant to take an integer value. Will croak if a non-integer value is found.

  • num - constains the constant to take a numeric value. Will croak if a non-numeric value is found.

  • bool - coerces the constant to take a boolean value. Whatever value is found will be converted to a boolean value.

SEE ALSO

constant - core module for defining constants, and used by Constant::FromGlobal.

constant::lexical - very similar to the constant pragma, but defines lexically-scoped constants.

Const::Fast - CPAN module for defining immutable variables (scalars, hashes, and arrays).

Config::Constants is a module that will load a configuration file into a number of function-style constants.

Adam Kennedy's original post that inspired this module.

constant modules - A review of all perl modules for defining constants, by Neil Bowers.

REPOSITORY

https://github.com/neilb/Constant-FromGlobal

AUTHOR

This module was originally written by Yuval Kogman, inspired by a blog post by Adam Kennedy, describing the "Constant Global" pattern.

The module is now being maintained by Neil Bowers <neilb@cpan.org>.

LICENSE

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.