1 # For internal Module::CoreList use only.
2 package Module::CoreList::TieHashDelta;
6 $VERSION = '5.20160520';
9 my ($class, $changed, $removed, $parent) = @_;
20 my ($self, $key) = @_;
22 if (exists $self->{changed}{$key}) {
23 return $self->{changed}{$key};
24 } elsif (exists $self->{removed}{$key}) {
26 } elsif (defined $self->{parent}) {
27 return $self->{parent}{$key};
33 my ($self, $key) = @_;
36 if (exists $self->{changed}{$key}) {
38 } elsif (exists $self->{removed}{$key}) {
40 } elsif (defined $self->{parent}) {
41 $self = tied %{$self->{parent}}; #avoid extreme magic/tie recursion
50 if (not $self->{keys_inflated}) {
51 # exceeds the warning limit of 100 calls since 5.23.2
52 no warnings 'recursion';
54 # This inflates the whole set of hashes... Somewhat expensive, but saves
55 # many tied hash calls later.
57 if (defined $self->{parent}) {
58 @parent_keys = keys %{$self->{parent}};
61 @parent_keys = grep !exists $self->{removed}{$_}, @parent_keys;
62 for my $key (@parent_keys) {
63 next if exists $self->{changed}->{$key};
64 $self->{changed}{$key} = $self->{parent}{$key};
67 $self->{keys_inflated} = 1;
70 keys %{$self->{changed}}; # reset each
76 each %{$self->{changed}};