#!/usr/bin/perl use strict; use warnings; use Test::More 'no_plan'; use ok 'Search::GIN::Query::Class'; use ok 'Search::GIN::Extract::Class'; { package MyGIN; use Moose; with ( qw( Search::GIN::Core Search::GIN::Driver::Hash Search::GIN::SelfIDs ), ); sub extract_values { my ( $self, $obj, @args ) = @_; return $self->objects_to_ids(@{ $obj->friends }); } package MyGIN::Query::Friends; use Moose; with qw(Search::GIN::Query); has friends => ( isa => "ArrayRef[Person]", is => "ro", required => 1, ); sub extract_values { my ( $self, $gin ) = @_; return ( values => [ $gin->objects_to_ids(@{ $self->friends }) ], ); } sub consistent { 1 } package Person; use Moose; has friends => ( isa => "ArrayRef[Person]", is => "rw", default => sub { [] }, ); } my @people = map { Person->new } 0 .. 4; $people[0]->friends([ @people[1,2] ]); $people[1]->friends([ @people[0,2,4] ]); $people[2]->friends([ @people[0,1] ]); $people[4]->friends([ $people[1] ]); my $gin = MyGIN->new; $gin->insert(@people); my $q = MyGIN::Query::Friends->new( friends => [ $people[1] ] ); my $res = $gin->query( $q ); is_deeply( [ sort $res->all ], [ sort @people[0, 2, 4] ], "friends of person 1", );