The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More 'tests' => 9;

package Foo; {
    use Object::InsideOut;
    my @foo :Field('Acc' => 'foo')
            :Deep;
}

package Bar; {
    use Object::InsideOut 'Foo';
    my @bar :Field('Acc' => 'bar');
}

package Baz; {
    use Object::InsideOut;
    my @baz :Field :All(baz);
}

package main;

my $adat = [ 'foo', 'bar', 'baz' ];
my $hdat = { 'bing' => 'bang', 'bop' => 'BOOM' };

my $obj = Bar->new();
$obj->foo($adat);
$obj->bar($hdat);

my $obj2 = $obj->clone();
is_deeply($obj->dump(), $obj2->dump()   => 'Clone equal');

$adat->[1] = 'trap';

my $data = $obj2->foo();
is($data->[1], 'bar'                    => 'Deep field copy');

$hdat->{'test'} = 'here';
$data = $obj->bar();
is($data->{'test'}, 'here'              => 'Shared data');

$data = $obj2->bar();
is($data->{'test'}, 'here'              => 'Shared data');

my $obj3 = $obj2->clone(1);
is_deeply($obj2->dump(), $obj3->dump()  => 'Clone equal');

$obj2->foo({ 'junk' => 0 });
$obj2->bar('data');

$data = $obj3->bar();
is($data->{'bop'}, 'BOOM'               => 'Deep object clone');
$data = $obj3->foo();
is($data->[2], 'baz'                    => 'Deep object clone');

my $baz = Baz->new();
$baz->baz($obj);
my $baz2 = $baz->clone(1);
my $objx = $baz->baz();
$data = $objx->bar();
is($data->{'test'}, 'here'              => 'Internal object');

$baz = Baz->new();
$baz->baz({'baz' => $obj});
$baz2 = $baz->clone(1);
$data = $baz->baz();
$objx = $$data{'baz'};
$data = $objx->bar();
is($data->{'test'}, 'here'              => 'Deep internal object');

exit(0);

# EOF