File Coverage

lib/Badger/Comparable.pm
Criterion Covered Total %
statement 7 11 63.6
branch n/a
condition n/a
subroutine 5 8 62.5
pod 7 7 100.0
total 19 26 73.0


line stmt bran cond sub pod time code
1             package Badger::Comparable;
2              
3             use Badger::Class
4 3         76 version => 0.01,
5             debug => 0,
6             import => 'CLASS',
7             base => 'Badger::Base',
8             utils => 'numlike is_object',
9             methods => {
10             eq => \&equal,
11             ne => \¬_equal,
12             lt => \&before,
13             gt => \&after,
14             le => \¬_after,
15             ge => \¬_before,
16             cmp => \&compare,
17             },
18             overload => {
19             '==' => \&equal,
20             '!=' => \¬_equal,
21             '<' => \&before,
22             '>' => \&after,
23             '<=' => \¬_after,
24             '>=' => \¬_before,
25             '<=>' => \&compare,
26             fallback => 1,
27 3     3   19 };
  3         9  
28              
29              
30             sub compare {
31 0     0 1 0 my $self = shift;
32 0         0 shift->not_implemented;
33             }
34              
35              
36             sub equal {
37 0     0 1 0 shift->compare(@_) == 0;
38             }
39              
40              
41             sub not_equal {
42 0     0 1 0 shift->compare(@_) != 0;
43             }
44              
45              
46             sub before {
47 4     4 1 24 shift->compare(@_) == -1;
48             }
49              
50              
51             sub after {
52 4     4 1 26 shift->compare(@_) == 1;
53             }
54              
55              
56             sub not_before {
57 1     1 1 5 shift->compare(@_) >= 0;
58             }
59              
60              
61             sub not_after {
62 1     1 1 12 shift->compare(@_) <= 0;
63             }
64              
65              
66             1;
67              
68              
69             =head1 NAME
70              
71             Badger::Comparable - base class for comparable objects
72              
73             =head1 SYNOPSIS
74              
75             package Your::Comparable::Object;
76             use base 'Badger::Comparable';
77              
78             # You must define a compare method that returns -1, 0 or +1
79             # if the object is less than, equal to, or greater than the
80             # object passed as an argument.
81              
82             sub compare {
83             my ($this, $that) = @_;
84            
85             # for example: comparing by a surname field
86             return $this->surname
87             cmp $that->surname;
88             }
89              
90             package main;
91              
92             # assume $obj1 and $obj2 are instance of above object class
93             if ($obj1 < $obj2) {
94             # do something
95             }
96              
97             =head1 DESCRIPTION
98              
99             This module implements a base class for comparable objects. Subclasses need
100             only define a L method and can inherit all the other methods
101             provided. Overloaded comparison operators are also defined.
102              
103             =head1 METHODS
104              
105             =head2 compare($that)
106              
107             This method must be defined by subclasses. It received the implicit C<$self>
108             object reference as the first argument and the object it is being compared to
109             as the second.
110              
111             The method can do whatever is necessary to compare the two objects. It should
112             return C<-1> if the C<$self> object should be ordered I the C<$that>
113             object, C<+1> if it should be ordered I, or 0 if the two objects are
114             considered the same.
115              
116             =head2 equal($that)
117              
118             Wrapper around L that returns true if the two objects are equal
119             (L returns C<0>).
120              
121             =head2 not_equal($that)
122              
123             Wrapper around L that returns true if the two objects are not
124             equal (L returns any non-zero value).
125              
126             =head2 before($that)
127              
128             Wrapper around L that returns true if the C<$self> object is ordered
129             before the C<$that> object passed as an argument (L returns C<-1>).
130              
131             =head2 not_before($that)
132              
133             Wrapper around L that returns the logical opposite of the
134             L method, returning a true value if the C<$self> object is greater
135             than or equal to the L<$that> object passed as an argument (L
136             returns C<0> or C<+1>).
137              
138             =head2 after($that)
139              
140             Wrapper around L that returns true if the C<$self> object is ordered
141             after the C<$that> object passed as an argument (L returns C<+1>).
142              
143             =head2 not_after($that)
144              
145             Wrapper around L that returns the logical opposite of the
146             L method, returning a true value if the C<$self> object is less
147             than or equal to the L<$that> object passed as an argument (L
148             returns C<-1> or C<0>).
149              
150             =head1 OVERLOADED OPERATORS
151              
152             =head2 ==
153              
154             This is mapped to the L method.
155              
156             if ($obja == $objb) {
157             # do something
158             }
159              
160             =head2 !=
161              
162             This is mapped to the L method.
163              
164             if ($obja != $objb) {
165             # do something
166             }
167              
168             =head2 <
169              
170             This is mapped to the L method.
171              
172             if ($obja < $objb) {
173             # do something
174             }
175              
176             =head2 >
177              
178             This is mapped to the L method.
179              
180             if ($obja > $objb) {
181             # do something
182             }
183              
184             =head2 <=
185              
186             This is mapped to the L method.
187              
188             if ($obja <= $objb) {
189             # do something
190             }
191              
192             =head2 >=
193              
194             This is mapped to the L method.
195              
196             if ($obja >= $objb) {
197             # do something
198             }
199              
200             =head1 AUTHOR
201              
202             Andy Wardley L
203              
204             =head1 COPYRIGHT
205              
206             Copyright (C) 2013 Andy Wardley. All Rights Reserved.
207              
208             This module is free software; you can redistribute it and/or modify it
209             under the same terms as Perl itself.
210              
211             =cut