The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Child;
our $VERSION='1.00_2222';
use strict;
use Hash::AutoHash;
our @ISA=qw(Hash::AutoHash);
our @NORMAL_EXPORT_OK=qw(autohash_new child_new not_defined);
our %RENAME_EXPORT_OK=(child_xxx=>'autohash_keys');
our @RENAME_EXPORT_OK=(sub {"child_$_"},qw(autohash_new child_new)); 
our @EXPORT_OK=Child::helper->EXPORT_OK;
our @SUBCLASS_EXPORT_OK=Child::helper->SUBCLASS_EXPORT_OK;

sub child_method {
  return 'child method';
}

#################################################################################
# helper package exists to avoid polluting Child namespace with
#   subs that would mask accessor/mutator AUTOLOADs
#################################################################################
package Child::helper;
use strict;
use Hash::AutoHash;
BEGIN {
  our @ISA=qw(Hash::AutoHash::helper);
}

sub child_new {
  new Child @_;
}
sub child_function_not_exported {
  return "I am a child function that is not exported\n";
}

#################################################################################
package Grandchild;
our $VERSION='1.00_3333';
use strict;
use Hash::AutoHash;
our @ISA=qw(Child);
our @NORMAL_EXPORT_OK=qw(autohash_new child_new grandchild_new not_defined);
our %RENAME_EXPORT_OK=(grandchild_xxx=>'child_xxx',grandchild_yyy=>'autohash_values');
our @RENAME_EXPORT_OK=(sub {"grandchild_$_"},qw(autohash_new child_new grandchild_new)); 
our @EXPORT_OK=Grandchild::helper->EXPORT_OK;
our @SUBCLASS_EXPORT_OK=Grandchild::helper->SUBCLASS_EXPORT_OK;

sub grandchild_method {
  return 'grandchild method';
}
#################################################################################
# helper package exists to avoid polluting Grandchild namespace with
#   subs that would mask accessor/mutator AUTOLOADs
#################################################################################
package Grandchild::helper;
use strict;
BEGIN {
  our @ISA=qw(Child::helper);
}

sub grandchild_new {
  new Grandchild @_;
}
sub grandchild_function_not_exported {
  return "I am a grandchild function that is not exported\n";
}

1;