The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;
use Test::More tests => 8;

use constant VERBOSE => !!$ENV{TEST_VERBOSE};

sub XXX{
	require Data::Dumper;
	my $ddx = Data::Dumper->new(\@_);
	$ddx->Indent(1);
	$ddx->Sortkeys(1);
	diag($ddx->Dump);
}

BEGIN{
	package A;
	use Hash::FieldHash qw(:all);

	fieldhash my %foo, 'foo';
	fieldhash my %bar, 'bar';

	sub new{
		my $class = shift;
		my $obj = bless do{ \my $o }, $class;
		return Hash::FieldHash::from_hash($obj, @_);
	}

	sub dump{
		my($self, $fully_qualify) = @_;
		return $self->to_hash($fully_qualify ? -fully_qualify : undef);
	}

	package B;
	use Hash::FieldHash qw(:all);
	our @ISA = qw(A);

	fieldhash my %baz, 'baz';

	package C;
	use Hash::FieldHash qw(:all);
	our @ISA = qw(B);
}

{
	my $x = B->new('A::foo' => 10, 'A::bar' => 20, 'B::baz' => 30);

	is_deeply $x->dump,    { foo => 10, bar => 20, baz => 30 };
	is_deeply $x->dump(1), { 'A::foo' => 10, 'A::bar' => 20, 'B::baz' => 30 };
}

{
	my $x = C->new('A::foo' => 10, 'A::bar' => 20, 'B::baz' => 30);

	is_deeply $x->dump,    { foo => 10, bar => 20, baz => 30 };
	is_deeply $x->dump(1), { 'A::foo' => 10, 'A::bar' => 20, 'B::baz' => 30 };

	is_deeply $x->dump(0), C->new($x->dump(0))->dump(0);
	is_deeply $x->dump(0), C->new($x->dump(1))->dump(0);
	is_deeply $x->dump(1), C->new($x->dump(0))->dump(1);
	is_deeply $x->dump(1), C->new($x->dump(1))->dump(1);
}

if(VERBOSE){
	if(defined &Hash::FieldHash::_name_registry){
		XXX( Hash::FieldHash::_name_registry() );
	}
}