Catching up after the holidays.
[kakapo:kakapo.git] / src / Matchers / Empty.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::Empty;
5 # Matches if target is an instance of a pre-specified class.
6
7 use('Dumper');
8 Program::initload(:after('Matcher::TypeSafe'));
9 Matcher::Factory::export_sub(Matcher::Empty::factory, :as('empty'));
10
11
12 sub _initload() {
13         if our $_Initload_done { return 0; }
14         $_Initload_done := 1;
15                         
16         my $class_name := 'Matcher::Empty';
17
18         Class::SUBCLASS($class_name,
19                 'Matcher::TypeSafe'
20         );
21 }
22
23 method describe_failure($item, $description) {
24         return $description ~ 'had type: ' ~ Opcode::typeof($item);
25 }
26
27 method describe_self($description) {
28         return $description 
29                 ~ "empty";
30 }
31
32 method matches_typesafe($item) {
33         if Opcode::can($item, 'is_empty') {
34                 return $item.is_empty();
35         }
36         elsif Opcode::can($item, 'elements') {
37                 return $item.elements() == 0;
38         }
39         elsif Opcode::does($item, 'array') {
40                 return Opcode::elements($item) == 0;
41         }
42         elsif Opcode::does($item, 'hash') {
43                 return $item.keys() == 0;
44         }
45         
46         Opcode::die("Don't know how to determine if this object is empty.");
47 }