use strict;
use warnings;
use Carp;
# Checks that the following relationships hold set-wise (e.g. ignoring order):
#
# keys($self->{v}) = $self->{sects}
#
# And for every section $sect:
#
# keys($self->{v}{sect}) = $self->{v}{params}
#
# This should be the case whenever control flows outside this module. Croaks
# upon any error.
sub Config::IniFiles::_assert_invariants {
my ($self)=@_;
my %set;
foreach my $sect (@{$self->{sects}}) {
croak "Non-lowercase section $sect" if ($self->{nocase} &&
(lc($sect) ne $sect));
$set{$sect}++;
}
foreach my $sect (keys %{$self->{v}}) {
croak "Key $sect in \$self->{v} and not in \$self->{sects}" unless
($set{$sect}++);
}
grep { croak "Key $_ in \$self->{sects} and not in in \$self->{v}" unless
$set{$_} eq 2 } (keys %set);
foreach my $sect (@{$self->{sects}}) {
%set=();
foreach my $parm (@{$self->{parms}{$sect}}) {
croak "Non-lowercase parameter $parm" if ($self->{nocase} &&
(lc($parm) ne $parm));
$set{$parm}++;
}
foreach my $parm (keys %{$self->{v}{$sect}}) {
croak "Key $parm in \$self->{v}{'$sect'} and not in \$self->{parms}{'$sect'}"
unless ($set{$parm}++);
}
grep { croak "Key $_ in \$self->{parms}{'$sect'} and not in in \$self->{v}{'$sect'}"
unless $set{$_} eq 2 } (keys %set);
}
}
1;