05cdfdd2dd1e254ecea6da9f9f5222ef43eb1ef0
[gitmo/Moose.git] / t / 006_basic.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 1;
7 use Test::Exception;
8
9 BEGIN {
10     use_ok('Moose');           
11 }
12
13 {
14     package Constraint;
15     use strict;
16     use warnings;
17     use Moose;
18
19     sub validate      { confess "Abstract method!" }
20     sub error_message { confess "Abstract method!" }
21
22     sub validation_value {
23         my ($self, $field) = @_;
24         return $field->value;
25     }
26
27     package Constraint::AtLeast;
28     use strict;
29     use warnings;
30     use Moose;
31
32     extends 'Constraint';
33
34     has 'value' => (isa => 'Num', is => 'ro');
35
36     sub validate {
37         my ($self, $field) = @_;
38         if ($self->validation_value($field) >= $self->value) {
39             return undef;
40         } 
41         else {
42             return $self->error_message;
43         }
44     }
45
46     sub error_message { 'must be at least ' . (shift)->value; }
47
48     package Constraint::NoMoreThan;
49     use strict;
50     use warnings;
51     use Moose;
52
53     extends 'Constraint';
54
55     has 'value' => (isa => 'Num', is => 'ro');
56
57     sub validate {
58         my ($self, $field) = @_;
59         if ($self->validation_value($field) <= $self->value) {
60             return undef;
61         } else {
62             return $self->error_message;
63         }
64     }
65
66     sub error_message { 'must be no more than ' . (shift)->value; }
67
68     package Constraint::OnLength;
69     use strict;
70     use warnings;
71     use Moose::Role;
72
73     has 'units' => (isa => 'Str', is => 'ro');
74
75     override 'value' => sub {
76         return length(super());
77     };
78
79     override 'error_message' => sub {
80         my $self = shift;
81         return super() . ' ' . $self->units;
82     };
83
84     package Constraint::LengthNoMoreThan;
85     use strict;
86     use warnings;
87     use Moose;
88
89     extends 'Constraint::NoMoreThan';
90        with 'Constraint::OnLength';
91        
92     package Constraint::LengthAtLeast;
93     use strict;
94     use warnings;
95     use Moose;
96     
97     extends 'Constraint::AtLeast';
98        with 'Constraint::OnLength';       
99 }