Activator
view release on metacpan or search on metacpan
lib/Activator/Registry.pm view on Meta::CPAN
This module provides global access to a registry of key-value pairs.
It is implemented as a singleton, so you can use this Object Oriented
or staticly with arrow notation. It supports getting and setting of
deeply nested objects. Setting can be done via YAML configuration
files.
=head1 CONFIGURATION FILES
Configuration files are YAML files.
=head2 Registry Within Another Configuration File
You can have a registry be a stand alone file, or live within a
configuration file used for other purposes. If you wish your registry
to be only a subset of a larger YAML file, put the desired hierarchy
in a top level key C<Activator::Registry>. If that key exists, only
that part of the YAML file will be registered.
=head2 Default Configuration File
Often, your project will have a central configuration file that you
always want to use. In these cases set the environment variable
C<ACT_REG_YAML_FILE>. All calls to L</new()>, L</load()> and
L</reload()> will register this file first, then any files passed as
arguments to those subroutines.
If you are utilizing this module from apache, this directive must be
in your httpd configuration:
SetEnv ACT_REG_YAML_FILE '/path/to/config.yml'
If you are using this module from a script, you need to ensure that
the environment is properly set. This my require that you utilize a
BEGIN block BEFORE the C<use> statement of any module that C<use>s
C<Activator::Registry> itself:
BEGIN{
$ENV{ACT_REG_YAML_FILE} ||= '/path/to/reg.yml'
}
Otherwise, you will get weirdness when all of your expected registry
keys are undef...
=head1 METHODS
=head2 new()
Returns a reference to a registry object. This is a singleton, so
repeated calls always return the same ref. This will load the file
specified by C<$ENV{ACT_REG_YAML_FILE}>, then C<$yaml_file>. If
neither are valid YAML files, you will have an object with an empty
registry. If the registry has already been loaded, DOES NOT RELOAD it.
use L</reload()> for that.
=cut
sub new {
my ( $pkg, $yaml_file ) = @_;
my $self = bless( {
DEFAULT_REALM => 'default',
REGISTRY => { },
# TODO: consider using this custom precedence:
# SAFE_LEFT_PRECEDENCE =>
# {
# 'SCALAR' => {
# 'SCALAR' => sub { $_[0] },
# 'ARRAY' => &die_array_scalar,
# 'HASH' => &die_hash_scalar,
# },
# 'ARRAY' => {
# 'SCALAR' => sub { [ @{ $_[0] }, $_[1] ] },
# 'ARRAY' => sub { [ @{ $_[0] }, @{ $_[1] } ] },
# 'HASH' => &die_hash_array,
# },
# 'HASH' => {
# 'SCALAR' => &die_scalar_hash,
# 'ARRAY' => &die_array_hash,
# 'HASH' => sub { _merge_hashes( $_[0], $_[1] ) },
# },
# },
}, $pkg);
$self->_init_StrongSingleton();
if ( $yaml_file ) {
$self->load( $yaml_file )
}
else {
$self->load();
}
return $self;
}
=head2 load()
Load a YAML file into the registry. Throws exception if the file has
already been successfully loaded.
=cut
sub load {
my ( $pkg, $yaml_file, $reload ) = @_;
my $self = $pkg->new();
my $registered_something;
if( $reload ) {
$self->{REGISTRY_BACKUP} = $self->{REGISTRY};
$self->{REGISTRY} = { };
}
if ( !keys( %{ $self->{REGISTRY} } ) ) {
if( defined ( $ENV{ACT_REG_YAML_FILE} ) && -f $ENV{ACT_REG_YAML_FILE} ) {
$self->register_file( $ENV{ACT_REG_YAML_FILE} );
$registered_something = 1;
}
if ( defined( $yaml_file ) && -f $yaml_file ) {
( run in 2.155 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )