| | 174 | sub _param2ts { |
| | 175 | my ( $param, $blog ) = @_; |
| | 176 | |
| | 177 | my ( $type, $value ); |
| | 178 | if ( 'HASH' eq ref($param) ) { |
| | 179 | $type = $param->{type}; |
| | 180 | $value = $param->{value}; |
| | 181 | } |
| | 182 | else { |
| | 183 | $type = 'ts'; |
| | 184 | $value = $param; |
| | 185 | } |
| | 186 | if ( 'CODE' eq ref($value) ) { |
| | 187 | $value = $value->(); |
| | 188 | } |
| | 189 | |
| | 190 | my $ts; |
| | 191 | if ( 'epoch' eq $type ) { |
| | 192 | $ts = epoch2ts( $blog, $value ); |
| | 193 | } |
| | 194 | elsif ( 'datetime' eq $type ) { |
| | 195 | $ts = sprintf "%04d%02d%02d%02d%02d%02d", |
| | 196 | $value->year, |
| | 197 | $value->month, |
| | 198 | $value->day, |
| | 199 | $value->hour, |
| | 200 | $value->minute, |
| | 201 | $value->second; |
| | 202 | } |
| | 203 | else { |
| | 204 | $ts = $value; |
| | 205 | } |
| | 206 | $ts; |
| | 207 | } |
| | 208 | |
| | 209 | sub compare { |
| | 210 | my $self = shift; |
| | 211 | my %param = @_; |
| | 212 | # a => $ts | CODE | { value => CODE|$v, type => ts|epoch|datetime } |
| | 213 | # b => $ts | CODE | { value => CODE|$v, type => ts|epoch|datetime } |
| | 214 | # blog => ref|N|undef |
| | 215 | # comparer => CODE|undef |
| | 216 | |
| | 217 | my $blog = $param{blog}; |
| | 218 | if ( defined($blog) && !ref($blog) ) { |
| | 219 | $blog = MT->model('blog')->load( $blog ); |
| | 220 | $blog = undef unless ref($blog); |
| | 221 | } |
| | 222 | |
| | 223 | if ( !exists($param{a}) && ref($self) ) { |
| | 224 | $param{a} = { value => $self, type => 'datetime' }; |
| | 225 | } |
| | 226 | my $ts_a = _param2ts( $param{a}, $blog ); |
| | 227 | |
| | 228 | if ( !exists($param{b}) && ref($self) ) { |
| | 229 | $param{b} = { value => $self, type => 'datetime' }; |
| | 230 | } |
| | 231 | my $ts_b = _param2ts( $param{b}, $blog ); |
| | 232 | |
| | 233 | my $comparer = $param{code}; |
| | 234 | if ( 'CODE' eq ref($comparer) ) { |
| | 235 | return $comparer->( $ts_a, $ts_b ); |
| | 236 | } |
| | 237 | else { |
| | 238 | return $ts_a - $ts_b; |
| | 239 | } |
| | 240 | } |
| | 241 | |