Catching up after the holidays.
[kakapo:kakapo.git] / src / Matchers / DescribedAs.nqp
1 # Copyright (C) 2009, Austin Hastings. See accompanying LICENSE file, or 
2 # http://www.opensource.org/licenses/artistic-license-2.0.php for license.
3
4 module Matcher::DescribedAs;
5 # Slathers a text label on another matcher.
6
7 use('Dumper');
8 Program::initload(:after('Matcher'));
9
10 sub _initload() {
11         if our $_Initload_done { return 0; }
12         $_Initload_done := 1;
13         
14         my $class_name := 'Matcher::DescribedAs';
15         
16         NOTE("Creating class ", $class_name);
17         Class::SUBCLASS($class_name,
18                 'Matcher'
19         );
20 }
21
22 method describe_failure($item, $description) {
23         return self.predicate.describe_failure($item, $description);
24 }
25
26 method describe_self($description) {
27         return self.predicate.describe_self($description ~ self.described_as ~ ' ');
28 }
29
30 method described_as(*@value)            { self._ATTR('described_as', @value); }
31
32 method init(@args, %opts) {
33         Matcher::init(self, @args, %opts);
34         
35         unless self.described_as {
36                 unless +@args {
37                         Opcode::die("You must provide a description");
38                 }
39                 
40                 self.described_as(@args.shift);
41         }
42         
43         unless self.predicate {
44                 unless +@args {
45                         Opcode::die("You must provide a Matcher predicate");
46                 }
47                 
48                 self.predicate(@args.shift);
49         }
50 }
51
52 method matches(*@item) {
53         my %opts;
54         my $result := Parrot::call_method_(self.predicate, 'matches', @item, %opts);
55         return $result;
56 }
57
58 method predicate(*@value)               { self._ATTR('predicate', @value); }