NAME
Config::Entities - An multi-level overridable perl based configuration
module
VERSION
version 0.02
SYNOPSIS
use Config::Entities;
# Assuming this directory structure:
#
# /project/config/entities
# |_______________________/a
# |_________________________/b.pm
# | { e => 'f' }
# |
# |_______________________/c.pm
# | { g => 'h' }
# |
# |_______________________/c
# |_________________________/d.pm
# | { i => 'j' };
my $entities = Config::Entities->new( '/project/config/entities' );
my $abe = $entities->{a}{b}{e}; # 'f'
my $ab = $entities->{a}{b}; # '{e=>'f'}
my $ab_e = $ab->{e}; # 'f'
my $cg = $entities->{c}{g}; # 'h'
my $cd = $entities->{c}{d}; # {i=>'j'}
my $cdi = $entities->{c}{d}{i}; # 'j'
my $c = $entities->{c}; # {g=>'h',d=>{i=>'j'}}
# Entities can be constructed with a set of properties to be used by configs.
# Assuming this directory structure:
#
# /project/config/entities
# |_______________________/a.pm
# | {
# | file => $Config::Entities::properties->{base_folder}
# | . '/sub/folder/file.txt'
# | }
my $entities = Config::Entities->new( '/project/config/entities',
{ properties => { base_folder => '/project' } } );
my $file = $entities->{a}{file}; # /project/sub/folder/file.txt
# You can also supply multiple entities folders
# Assuming this directory structure:
#
# /project/config
# |______________/entities
# |_______________________/a.pm
# | { b => 'c' }
# |
# |______________/more_entities
# |____________________________/d.pm
# | { e => $Config::Entities::properties->{f} }
my $entities = Config::Entities->new(
'/project/config/entities',
'/project/config/more_entities',
{ properties => {f => 'g'} } ); # { b => 'c', e => 'g' }
# You can also specify a properties file
# Assuming this directory structure:
#
# /project/config
# |______________/entities
# |_______________________/a.pm
# | { b => $Config::Entities::properties->{e} }
# |
# |______________/properties.pl
# | { e => 'f' }
my $entities = Config::Entities->new(
'/project/config/entities',
{ properties_file => '/project/config/properties.pl } );
my $ab = $entities->{a}{b}; # 'f'
# Assuming:
#
# {
# a => {
# b => {
# c => 'd',
# e => 'f'
# },
# g => 'h'
# }
# }
#
# You can use dotted notation to refer to entities using get_entity
my $ab = $entities->get_entity( 'a.b' ); # {c=>'d',e=>'f'}
# You can fill a hash with many values at once using fill
my $ab_abc_abe = $entities->fill( 'a.b',
{c=>undef, e=>undef} ); # {c=>'d',e=>'f'}
# Perhaps the most useful approach is filling a hash from a coordinate
# or its parents
my $ab_abc_abe_ag = $entities->fill( 'a.b',
{c=>undef, e=>undef, g=>undef},
ancestry => 1 ); # {c=>'d',e=>'f',g=>'h'}
DESCRIPTION
In essense, this module will recurse a directory structure, running do
FILE for each entry and merging its results into the Entities object
which can be treated as a hash. Given that it runs do FILE, each config
node is a fully capable perl script.
CONSTRUCTORS
new( $entities_root_dir [, $entities_root_dir, ...] \%options )
Recurses into each $entities_root_dir loading its contents into the
entities map. The filesystem structure will be propagated to the map,
each sub folder representing a sub hash. If both Xxx.pm and a folder
Xxx are found, the Xxx.pm will be loaded first then the recursion will
enter Xxx and merge its results over the top of what is already in the
map. If properties are provided via properties or properties_file, they
can be accessed using Config::Entities::properties in the individual
config files. The currently available options are:
properties
Properties to be loaded into Config::Entities::properties. Will
override any properties with the same name loaded by properties_file.
properties_file
A file that will be loaded into Config::Entities::properties using do
FILE
METHODS
fill( $coordinate, $hashref, [%options] )
Will iterate through the keys of $hashref setting the associated value
to the value found at the same key in the entity matching $coordinate.
The currently available options are:
ancestry
If true, the search will continue up the ancestry until it finds a
match.
get_entity( $coordinate, [%options] )
A simple dotted notation for indexing into the map. For example,
$entities-get_entity( 'a.b.c' )> is equivalent to $entities-{a}{b}{c}.
The currently available options are:
ancestry
If true, a list will be returned where the first element is the
matching entity, and each successive entity is its parent, all the
way up to $self.
AUTHOR
Lucas Theisen <
[email protected]>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Lucas Theisen.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.