File Coverage

blib/lib/Data/Page/Balanced.pm
Criterion Covered Total %
statement 61 65 93.8
branch 20 22 90.9
condition 7 8 87.5
subroutine 11 11 100.0
pod 4 4 100.0
total 103 110 93.6


line stmt bran cond sub pod time code
1             # $Id: Balanced.pm 2 2007-10-27 22:08:58Z kim $
2              
3             package Data::Page::Balanced;
4              
5 3     3   73464 use warnings;
  3         7  
  3         88  
6 3     3   17 use strict;
  3         5  
  3         91  
7 3     3   16 use Carp;
  3         10  
  3         314  
8 3     3   2666 use POSIX qw(ceil floor);
  3         21430  
  3         20  
9 3     3   3299 use base qw(Class::Accessor::Chained::Fast Data::Page);
  3         6  
  3         2793  
10 3     3   25563 use version; our $VERSION = qv('1.0.0');
  3         6310  
  3         19  
11              
12             __PACKAGE__->mk_accessors(qw(flexibility));
13              
14             sub new {
15 22     22 1 12442 my ($class, $arg_ref) = @_;
16 22         39 my $self = {};
17            
18 22 100 66     145 croak('total_entries and entries_per_page must be supplied.')
19             if !defined $arg_ref->{'total_entries'}
20             || !defined $arg_ref->{'entries_per_page'};
21            
22 19 100       58 croak( sprintf 'There must be at least one entry per page. %d is too small.', $arg_ref->{'entries_per_page'} )
23             if $arg_ref->{'entries_per_page'} < 1;
24            
25 18         43 bless $self, $class;
26              
27             # flexibility can be 0, which is false, so can't use ||-assignment
28 18 100       111 my $flexibility = exists $arg_ref->{flexibility} ? $arg_ref->{flexibility} : floor($arg_ref->{entries_per_page} / 2);
29            
30 18         1421 $self->_flexibility_accessor( $flexibility );
31 18         183 $self->_total_entries_accessor( $arg_ref->{total_entries} );
32 18   100     191 $self->_current_page_accessor( $arg_ref->{current_page} || 1 );
33 18         130 $self->_entries_per_page_accessor( $arg_ref->{entries_per_page} );
34 18         112 $self->_entries_per_page_accessor( $self->_get_balanced_epp() );
35            
36 18         128 return $self;
37             }
38              
39             # Calculate the entries_per_page (expected_epp) within the limits of the flexibility
40             sub _get_balanced_epp {
41 20     20   27 my ($self) = @_;
42            
43 20         35 my $flexibility = $self->flexibility();
44 20         110 my $total_entries = $self->total_entries();
45 20         109 my $entries_per_page = $self->entries_per_page();
46            
47 20 100 100     171 return $entries_per_page
48             if $flexibility == 0
49             || $total_entries == 0;
50            
51 17 100       53 return $entries_per_page
52             if $total_entries < $entries_per_page;
53            
54 16         46 my $pages = ceil($total_entries / $entries_per_page);
55 16         25 my $expected_epp = $total_entries / $pages;
56            
57 16         33 ENTRIES: while ( $expected_epp < $entries_per_page ) {
58 12         16 $pages--;
59            
60 12 50       23 if ( $pages < 1 ) {
61 0         0 $pages = 1;
62             }
63            
64 12         13 $expected_epp = $total_entries / $pages;
65            
66 12 100       32 if ( $expected_epp > $entries_per_page + $flexibility ) {
67 3         4 $expected_epp = $entries_per_page;
68 3         6 last ENTRIES;
69             }
70             }
71            
72 16         67 return ceil($expected_epp);
73             }
74              
75             sub total_entries {
76 105     105 1 7972 my ($self, $total_entries) = @_;
77            
78 105 100       184 if ( defined $total_entries ) {
79 1         25 my $accessor = $self->_total_entries_accessor($total_entries);
80 1         10 $self->_entries_per_page_accessor( $self->_get_balanced_epp() );
81 1         7 return $accessor;
82             }
83              
84 104         243 return $self->_total_entries_accessor();
85             }
86              
87             sub entries_per_page {
88 134     134 1 9688 my ($self, $entries_per_page) = @_;
89            
90 134 100       280 if ( defined $entries_per_page ) {
91 2 100       27 croak( sprintf 'There must be at least one entry per page. %d is too small.', $entries_per_page )
92             if $entries_per_page < 1;
93            
94 1         4 $self->_entries_per_page_accessor($entries_per_page);
95 1         8 return $self->_entries_per_page_accessor( $self->_get_balanced_epp() );
96             }
97            
98 132         283 return $self->_entries_per_page_accessor();
99             }
100              
101             sub flexibility {
102 22     22 1 679 my ($self, $flexibility) = @_;
103            
104 22 50       47 if ( defined $flexibility ) {
105 0         0 my $accessor = $self->_flexibility_accessor($flexibility);
106 0         0 $self->_entries_per_page_accessor( $self->_get_balanced_epp() );
107 0         0 return $accessor;
108             }
109              
110 22         49 return $self->_flexibility_accessor();
111             }
112              
113              
114             1;
115             __END__