14 my %servers = map +($_ => { name => $_ }), @servers;
16 my @shells = qw(csh bash);
19 bash => { name => 'bash',
22 qw(joe.example.com kitty.scsys.co.uk)
25 csh => { name => 'csh',
28 qw(jim.example.com joe.example.com bob.example.com)
33 my $solver = DX::Solver->new(
35 servers => DX::SetOver->new(
36 over => sub { $_[0]->{name} }, values => \%servers,
38 shells => DX::SetOver->new(
39 over => sub { $_[0]->{name} }, values => \%shells,
45 server => [ 'S' ] => [ member_of => S => [ value => 'servers' ] ]
48 my $s = $solver->query([ 'S' ], [ call => server => 'S' ]);
50 is_deeply([ map $_->{S}{name}, $s->results ], [ sort @servers ]);
53 shell => [ 'S' ] => [ member_of => S => [ value => 'shells' ] ])
54 ->add_rule(name => [ qw(T N) ],
55 [ constrain => [ qw(T N) ],
56 sub { $_[0]->{name} eq $_[1] } ]
58 ->add_rule(shell_installed_on => [ qw(Shell Srv) ],
59 [ constrain => [ qw(Shell Srv) ],
60 sub { $_[0]->{installed_on}{$_[1]->{name}} } ]
66 [ name => 'Shell', [ value => 'bash' ] ],
68 [ shell_installed_on => qw(Shell Srv) ],
72 [ sort map $_->{Srv}{name}, $s->results ],
73 [ qw(joe.example.com kitty.scsys.co.uk) ]