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 }
36 $solver->add_rule(server => [ 'S' ] => [ member_of => qw(S servers) ]);
38 my $s = $solver->query([ 'S' ], [ call => server => 'S' ]);
40 is_deeply([ map $_->{S}{name}, $s->results ], [ sort @servers ]);
42 $solver->add_rule(shell => [ 'S' ] => [ member_of => qw(S shells) ])
43 ->add_rule(name => [ qw(T N) ],
44 [ constrain => [ qw(T N) ],
45 sub { ::Dwarn(\@_); $_[0]->{name} eq $_[1] } ]
47 ->add_rule(shell_installed_on => [ qw(Shell Srv) ],
48 [ constrain => [ qw(Shell Srv) ],
49 sub { $_[0]->{installed_on}{$_[1]->{name}} } ]
54 [ call => shell => 'Shell' ],
55 [ call => name => 'Shell', [ value => 'bash' ] ],
56 [ call => server => 'Srv' ],
57 [ call => shell_installed_on => qw(Shell Srv) ],