Catching up after the holidays.
[kakapo:kakapo.git] / src / Matchers / Elements.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::Elements;
5 # Matches when the C< .elements > of an object equal a given number.
6 # TODO: Create a Matcher variant, to allow C< elements(both(ge(0), lt(6))) >.
7
8 use('Dumper');
9 Program::initload(:after('Matcher::TypeSafe'));
10 Matcher::Factory::export_sub(Matcher::Elements::factory, :as('elements'));
11
12 sub _initload() {
13         if our $_Initload_done { return 0; }
14         $_Initload_done := 1;
15         
16         my $class_name := 'Matcher::Elements';
17         
18         NOTE("Creating class ", $class_name);
19         Class::SUBCLASS($class_name,
20                 'Matcher::TypeSafe'
21         );
22         
23         Class::multi_method($class_name, 'matches_typesafe', :starting_with('_match_'));
24 }
25
26 method describe_failure_typesafe($item, $description) {
27         return $description 
28                 ~ $item.elements ~ " elements";
29 }
30
31 method describe_self($description) {
32         return $description 
33                 ~ self.value ~ " elements";
34 }
35         
36 sub factory($count)                                     { Matcher::Elements.new($count); }
37
38 method init(@children, %attributes) {
39         Matcher::init(self, @children, %attributes);
40         
41         unless +@children {
42                 DIE("You must provide an elements count for 'Elements' matcher.");
43         }
44         
45         self.value(0 + @children.shift);
46 }
47
48 method match_array($item) {
49         return $item.elements == self.value;
50 }
51
52 method _match_FixedPMCArray($item)              { self.match_array($item); }
53 method _match_FixedStringArray($item)           { self.match_array($item); }
54 method _match_Hash($item)                       { self.match_array($item); }
55 method _match_ResizablePMCArray($item)  { self.match_array($item); }
56 method _match_ResizableStringArray($item)       { self.match_array($item); }
57
58 method value(*@value)                           { self._ATTR('value', @value); }