Data-Hive
view release on metacpan or search on metacpan
lib/Data/Hive/Store/Param.pm view on Meta::CPAN
#pod
#pod = path_packer
#pod
#pod This is an object providing the L<Data::Hive::PathPacker> interface. It will
#pod convert a string to a path (arrayref) or the reverse. It defaults to a
#pod L<Data::Hive::PathPacker::Strict>.
#pod
#pod = exists
#pod
#pod This is a coderef used to check whether a given parameter name exists. It will
#pod be called as a method on the Data::Hive::Store::Param object with the path name
#pod as its argument.
#pod
#pod The default behavior gets a list of all parameters and checks whether the given
#pod name appears in it.
#pod
#pod = delete
#pod
#pod This is a coderef used to delete the value for a path from the hive. It will
#pod be called as a method on the Data::Hive::Store::Param object with the path name
#pod as its argument.
#pod
#pod The default behavior is to call the C<delete> method on the object providing
#pod the C<param> method.
#pod
#pod =end :list
#pod
#pod =cut
sub path_packer { $_[0]{path_packer} }
sub name { $_[0]->path_packer->pack_path($_[1]) }
sub new {
my ($class, $obj, $arg) = @_;
$arg ||= {};
my $guts = {
obj => $obj,
path_packer => $arg->{path_packer} || do {
require Data::Hive::PathPacker::Strict;
Data::Hive::PathPacker::Strict->new;
},
method => $arg->{method} || 'param',
exists => $arg->{exists} || sub {
my ($self, $key) = @_;
my $method = $self->{method};
my $exists = grep { $key eq $_ } $self->param_store->$method;
return ! ! $exists;
},
delete => $arg->{delete} || sub {
my ($self, $key) = @_;
$self->param_store->delete($key);
},
};
return bless $guts => $class;
}
sub param_store { $_[0]{obj} }
sub _param {
my $self = shift;
my $meth = $self->{method};
my $path = $self->name(shift);
return $self->param_store->$meth($path, @_);
}
sub get {
my ($self, $path) = @_;
return $self->_param($path);
}
sub set {
my ($self, $path, $val) = @_;
return $self->_param($path => $val);
}
sub exists {
my ($self, $path) = @_;
my $code = $self->{exists};
my $key = $self->name($path);
return $self->$code($key);
}
sub delete {
my ($self, $path) = @_;
my $code = $self->{delete};
my $key = $self->name($path);
return $self->$code($key);
}
sub keys {
my ($self, $path) = @_;
my $method = $self->{method};
my @names = $self->param_store->$method;
my %is_key;
PATH: for my $name (@names) {
my $this_path = $self->path_packer->unpack_path($name);
next unless @$this_path > @$path;
for my $i (0 .. $#$path) {
next PATH unless $this_path->[$i] eq $path->[$i];
}
$is_key{ $this_path->[ $#$path + 1 ] } = 1;
}
return keys %is_key;
}
( run in 0.473 second using v1.01-cache-2.11-cpan-64ef6c95b5d )