Data-Annotation
view release on metacpan or search on metacpan
lib/Data/Annotation/Rule.pm view on Meta::CPAN
package Data::Annotation::Rule;
use v5.24;
use utf8;
use Moo;
use warnings;
use experimental qw< signatures >;
{ our $VERSION = '0.006' }
use Data::Annotation::Expression qw< evaluator_factory >;
use namespace::clean;
has name => (is => 'ro', predicate => 1);
has description => (is => 'ro', default => '');
has record => (is => 'ro', predicate => 1);
has retval => (is => 'ro', init_arg => 'return', predicate => 1);
has parse_context => (is => 'ro', default => undef,
init_arg => 'condition-parse-context');
has condition => (is => 'ro', default => 1);
has _condition => (is => 'lazy');
sub _build__condition ($self) {
my $condition = $self->condition;
return evaluator_factory($condition, $self->parse_context // {})
if ref($condition) eq 'HASH';
return sub { $condition };
}
sub evaluate ($self, $overlay) {
return unless $self->_condition->($overlay);
if ($self->has_record) {
my $record = $self->record;
if (exists($record->{delete})) {
for my $skey ($record->{delete}->@*) {
my $key = $skey =~ s{\A \.?}{}rmxs;
$overlay->delete($key);
}
}
if (exists($record->{set})) {
my $set = $record->{set};
for my $skey (keys($set->%*)) {
my $key = $skey =~ s{\A \.?}{}rmxs;
$overlay->set($key, $set->{$skey});
}
}
}
return $self->retval if $self->has_retval;
return;
}
1;
( run in 0.529 second using v1.01-cache-2.11-cpan-524268b4103 )