The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Ties;
use warnings;	# Remove this for production. Assumes perl 5.6
use strict;

my $ties = 0;

sub count {
    return $ties;
}

END {
    die "You still have ties hanging" if $ties;
}

package Stie;
my $sfetches = 0;

sub TIESCALAR {
    my ($class, $value) = @_;
    $ties++;
    return bless [$value], $class;
}

sub FETCH {
    $sfetches++;
    return shift->[0];
}

sub DESTROY {
    $ties--;
}

sub fetches {
    my $old = $sfetches;
    $sfetches = 0;
    return $old;
}

package Atie;
my $afetches = 0;
sub TIEARRAY {
    my $class = shift;
    $ties++;
    return bless {foo => \@_}, $class;
}

sub FETCH {
    $afetches++;
    # main::diag("Array fetch @_");
    return $_[0]->{foo}[$_[1]];
}

sub FETCHSIZE {
    return scalar @{shift->{foo}};
}

sub DESTROY {
    $ties--;
}

sub fetches {
    my $old = $afetches;
    $afetches = 0;
    return $old;
}

package Htie;
my $hfetches = 0;
sub TIEHASH {
    my ($class, %hash) = @_;
    $ties++;
    return bless [\%hash], $class;
}

sub FETCH {
    $hfetches++;
    return $_[0][0]{$_[1]};
}

sub FIRSTKEY {
    my $array = shift;
    keys %{$array->[0]};	# reset each
    return each %{$array->[0]};
}

sub NEXTKEY {
    my $array = shift;
    return each %{$array->[0]};
}

sub EXISTS {
    return exists $_[0][0]{$_[1]};
}

sub DESTROY {
    $ties--;
}

sub fetches {
    my $old = $hfetches;
    $hfetches = 0;
    return $old;
}

1;