- For SQL wildcards :
- 'a___b\\__' is translated to 'a(.)(.)(.)b\\_(.)' if $CaptureSingle is true
- 'a...b\\_.' otherwise (default)
+sub _validate {
+ my $self = shift;
+ _check_self $self;
+ my $valid = shift;
+ my $old = shift;
+ $old = { } unless defined $old;
+ my $c;
+ if (@_ <= 1) {
+ $c = { set => $_[0] };
+ } elsif (@_ % 2) {
+ croak 'Arguments must be passed as an unique scalar or as key => value pairs';
+ } else {
+ my %args = @_;
+ $c = { map { (exists $args{$_}) ? ($_ => $args{$_}) : () } qw/set add rem/ };
+ }
+ for (qw/set add rem/) {
+ my $v = $c->{$_};
+ next unless defined $v;
+ my $cb = {
+ '' => sub { +{ ($_[0] => 1) x (exists $valid->{$_[0]}) } },
+ 'ARRAY' => sub { +{ map { ($_ => 1) x (exists $valid->{$_}) } @{$_[0]} } },
+ 'HASH' => sub { +{ map { ($_ => $_[0]->{$_}) x (exists $valid->{$_}) }
+ keys %{$_[0]} } }
+ }->{ ref $v };
+ croak 'Wrong option set' unless $cb;
+ $c->{$_} = $cb->($v);
+ }
+ my $config = (exists $c->{set}) ? $c->{set} : $old;
+ $config->{$_} = $c->{add}->{$_} for grep $c->{add}->{$_},
+ keys %{$c->{add} || {}};
+ delete $config->{$_} for grep $c->{rem}->{$_}, keys %{$c->{rem} || {}};
+ $config;
+}