13 my %servers = map +($_ => { name => $_ }), @servers;
15 my @shells = qw(csh bash);
18 bash => { name => 'bash',
21 qw(joe.example.com kitty.scsys.co.uk)
24 csh => { name => 'csh',
27 qw(jim.example.com joe.example.com bob.example.com)
32 my $solver = DX::Solver->new(
33 facts => { servers => \%servers, shells => \%shells }
37 server => [ 'S' ] => [ member_of => S => [ value => 'servers' ] ]
40 my $s = $solver->query([ 'S' ], [ call => server => 'S' ]);
42 is_deeply([ map $_->{S}{name}, $s->results ], [ sort @servers ]);
45 shell => [ 'S' ] => [ member_of => S => [ value => 'shells' ] ])
46 ->add_rule(name => [ qw(T N) ],
47 [ constrain => [ qw(T N) ],
48 sub { $_[0]->{name} eq $_[1] } ]
50 ->add_rule(shell_installed_on => [ qw(Shell Srv) ],
51 [ constrain => [ qw(Shell Srv) ],
52 sub { $_[0]->{installed_on}{$_[1]->{name}} } ]
58 [ name => 'Shell', [ value => 'bash' ] ],
60 [ shell_installed_on => qw(Shell Srv) ],
64 [ sort map $_->{Srv}{name}, $s->results ],
65 [ qw(joe.example.com kitty.scsys.co.uk) ]