sub FIRSTKEY { my $self = shift; if (! @_) { return $self->[0]->{FIRSTKEY}; } # ... walk the tree to gather nested keys $self->[1]->{iter} = \@list; # $_[0] is an empty array provided by the machinery that calls ->FIRSTKEY underneath. my $name = shift(@list); push(@{$_[0]}, $name); # Either way works... return $name; }