Hash-Layout
view release on metacpan or search on metacpan
lib/Hash/Layout.pm view on Meta::CPAN
use Moo;
use Types::Standard qw(:all);
use Scalar::Util qw(blessed looks_like_number);
use Hash::Merge::Simple 'merge';
use Clone;
use Text::Glob qw( match_glob );
use Hash::Layout::Level;
has 'levels', is => 'ro', isa => ArrayRef[
InstanceOf['Hash::Layout::Level']
], required => 1, coerce => \&_coerce_levels_param;
sub num_levels { scalar(@{(shift)->levels}) }
has 'default_value', is => 'ro', default => sub { 1 };
has 'default_key', is => 'ro', isa => Str, default => sub { '*' };
has 'allow_deep_values', is => 'ro', isa => Bool, default => sub { 1 };
has 'deep_delimiter', is => 'ro', isa => Str, default => sub { '.' };
has 'no_fill', is => 'ro', isa => Bool, default => sub { 0 };
has 'no_pad', is => 'ro', isa => Bool, default => sub { 0 };
has 'enable_globmatch', is => 'ro', isa => Bool, default => sub { 0 };
has 'lookup_mode', is => 'rw', isa => Enum[qw(get fallback merge)],
default => sub { 'merge' };
has '_Hash', is => 'ro', isa => HashRef, default => sub {{}}, init_arg => undef;
has '_Hash_fq_composite', is => 'ro', isa => HashRef, default => sub {{}}, init_arg => undef;
has '_all_level_keys', is => 'ro', isa => HashRef, default => sub {{}}, init_arg => undef;
# List of bitmasks representing every key path which includes
# a default_key, with each bit representing the level and '1' toggled on
# where the key is the default
has '_def_key_bitmasks', is => 'ro', isa => HashRef, default => sub {{}}, init_arg => undef;
sub Data { Clone::clone( (shift)->_Hash ) }
sub level_keys {
my ($self, $index) = @_;
die 'level_keys() expects level index argument'
unless (looks_like_number $index);
die "No such level index '$index'"
unless ($self->levels->[$index]);
( run in 0.776 second using v1.01-cache-2.11-cpan-5f2e87ce722 )