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

use strict;
use warnings;

use Test::More 'no_plan';
use Test::Exception;

BEGIN {
    use_ok('KiokuDB::Navigator');
}

use KiokuDB;

{
    package Person;
    use Moose;
    use MooseX::AttributeHelpers;

    has ['first_name', 'last_name'] => (is => 'rw', isa => 'Str');
    has 'age'      => (is => 'rw', isa => 'Int');
    has 'spouse'   => (is => 'rw', isa => 'Person');

    has ['mother', 'father'] => (
        is        => 'ro',
        isa       => 'Person',
        weak_ref  => 1,
        trigger   => sub {
            my ($self, $parent) = @_;
            $parent->add_child($self);
        }
    );

    has 'children' => (
        metaclass => 'Collection::Array',
        is        => 'rw',
        isa       => 'ArrayRef[Person]',
        lazy      => 1,
        default   => sub { [] },
        provides  => {
            'push' => 'add_child'
        }
    );

    has 'car' => (is => 'rw', isa => 'Car');

    package Car;
    use Moose;

    has 'owner' => (
        is       => 'rw',
        isa      => 'Person',
        weak_ref => 1,
        trigger  => sub {
            my ($self, $owner) = @_;
            $owner->car($self);
        }
    );

    has [ 'make', 'model', 'vin' ] => (is => 'rw');
}

my $db = KiokuDB->connect("hash");

{

    my $s = $db->new_scope;

    my $homer = Person->new(first_name => 'Homer', last_name => 'Simpson', age => 35);
    my $marge = Person->new(first_name => 'Marge', last_name => 'Simpson', age => 32, spouse => $homer);
    $homer->spouse($marge);

    my $minivan = Car->new(make => 'Toyota', model => 'Sienna', vin => '12345abcdefghijklmno', owner => $marge);
    my $volvo   = Car->new(make => 'Volvo', model => 'Sedan', vin => '12345abcdefghijklmno', owner => $homer);

    my %parents = (father => $homer, mother => $marge);

    my @children = (
        Person->new(first_name => 'Bart',  last_name => 'Simpson', age => 11, %parents),
        Person->new(first_name => 'Lisa',  last_name => 'Simpson', age => 9,  %parents),
        Person->new(first_name => 'Magie', last_name => 'Simpson', age => 1,  %parents),
    );

    $db->txn_do(sub {
        $db->store(
            Homer    => $homer,
            Marge    => $marge,
            The_Kids => \@children,
            The_Cars => [ $minivan, $volvo ]
        );
    });
}

pass('... this is tricky to test');

# ok(KiokuDB::Navigator->new( db => $db )->run, '... horray, how did you like it?');