File Coverage

blib/lib/Date/Holidays/UK/EnglandAndWales.pm
Criterion Covered Total %
statement 13 17 76.4
branch 7 20 35.0
condition 1 3 33.3
subroutine 3 4 75.0
pod 1 1 100.0
total 25 45 55.5


line stmt bran cond sub pod time code
1             package Date::Holidays::UK::EnglandAndWales;
2 2     2   84264 use strict;
  2         5  
  2         77  
3 2     2   12 use warnings;
  2         5  
  2         2084  
4              
5             our $VERSION = '0.03'; # Updated dates
6              
7             require Exporter;
8             require Tie::Hash ;
9              
10             our @ISA = qw( Exporter Tie::StdHash );
11             our @EXPORT = qw( is_uk_holiday );
12              
13             =head1 NAME
14              
15             Date::Holidays::UK::EnglandAndWales - Public Holidays in England and Wales
16              
17             =head1 SYNOPSIS
18              
19             use Date::Holidays::UK::EnglandAndWales;
20             my ($year, $month, $day) = (localtime)[ 5, 4, 3 ];
21             $year += 1900;
22             $month += 1;
23             warn "Holiday" if is_uk_holiday( $year, $month, $day );
24             warn "Holiday" if Date::Holidays::UK::EnglandAndWales->is_holiday( $year, $month, $day );
25              
26             =head1 DESCRIPTION
27              
28             These bank and public holidays are holidays in England and Wales,
29             and not necessarily for Scotland and Northern Ireland.
30              
31             =head2 MODULE HISTORY
32              
33             This module is based on L
34             by Richard Clamp, Amelie Guyot, Jerome Parfant, which did not contain
35             the dates needed by my clients.
36              
37             As Msrs Clamp et al note in the L,
38             Naming modules is a tricky thing: I've named this C because
39             the C module cannot include holidays for Northern Ireland and Scotland,
40             and maintain its API, since the dates vary across the UK for events of the same name.
41              
42             =head2 USE
43              
44             =head3 is_uk_holiday( $year, $month, $day )
45              
46             =head3 is_holiday( $year, $month, $day );
47              
48             =head3 Date::Holidays::UK::EnglandAndWales->is_holiday( $year, $month, $day )
49              
50             May be called as class method or subroutine.
51             Returns the name of the Holiday that falls on the given day, or undef
52             if there is none.
53              
54             Year must be four-digit. Strips any leading zeros from month and day.
55              
56             Can be included or imported to a class as an object method, since the first
57             argument supplied is discarded if an reference.
58              
59             =head2 EXPORTS
60              
61             C is exported by default, but this is deprecated and will
62             be removed in a future version.
63              
64             =cut
65              
66             our (%holidays, %_holidays);
67              
68             $_holidays{ 2005, 1, 3 } =
69             $_holidays{ 2006, 1, 2 } =
70             $_holidays{ 2011, 1, 3 } =
71             $_holidays{ 2012, 1, 2 } =
72             "Substitute Bank Holiday in lieu of 1 Jan";
73              
74             $_holidays{ 2004, 4, 9 } =
75             $_holidays{ 2005, 3, 25 } =
76             $_holidays{ 2006, 4, 14 } =
77             $_holidays{ 2007, 4, 6 } =
78             $_holidays{ 2008, 3, 21 } =
79             $_holidays{ 2009, 4, 10 } =
80             $_holidays{ 2010, 4, 2 } =
81             $_holidays{ 2011, 4, 22 } =
82             $_holidays{ 2012, 4, 6 } =
83             $_holidays{ 2013, 3, 29 } =
84             $_holidays{ 2014, 4, 15 } =
85             "Good Friday";
86              
87             $_holidays{ 2004, 4, 12 } =
88             $_holidays{ 2005, 3, 28 } =
89             $_holidays{ 2006, 4, 17 } =
90             $_holidays{ 2007, 4, 9 } =
91             $_holidays{ 2008, 3, 24 } =
92             $_holidays{ 2009, 4, 13 } =
93             $_holidays{ 2010, 4, 5 } =
94             $_holidays{ 2011, 4, 25 } =
95             $_holidays{ 2012, 4, 9 } =
96             $_holidays{ 2013, 4, 1 } =
97             $_holidays{ 2014, 4, 21 } =
98             "Easter Monday";
99              
100             $_holidays{ 2004, 5, 3 } =
101             $_holidays{ 2005, 5, 2 } =
102             $_holidays{ 2006, 5, 1 } =
103             $_holidays{ 2007, 5, 7 } =
104             $_holidays{ 2008, 5, 5 } =
105             $_holidays{ 2009, 5, 4 } =
106             $_holidays{ 2010, 5, 3 } =
107             $_holidays{ 2011, 5, 2 } =
108             $_holidays{ 2012, 5, 7 } =
109             $_holidays{ 2013, 5, 6 } =
110             $_holidays{ 2014, 5, 5 } =
111             "Early May Bank Holiday";
112              
113             $_holidays{ 2004, 5, 31 } =
114             $_holidays{ 2005, 5, 30 } =
115             $_holidays{ 2006, 5, 29 } =
116             $_holidays{ 2007, 5, 28 } =
117             $_holidays{ 2008, 5, 26 } =
118             $_holidays{ 2009, 5, 25 } =
119             $_holidays{ 2010, 5, 31 } =
120             $_holidays{ 2011, 5, 30 } =
121             $_holidays{ 2012, 5, 28 } =
122             $_holidays{ 2013, 5, 27 } =
123             $_holidays{ 2014, 5, 26 } =
124             "Spring Bank Holiday";
125              
126             $_holidays{ 2004, 8, 30 } =
127             $_holidays{ 2005, 8, 29 } =
128             $_holidays{ 2006, 8, 28 } =
129             $_holidays{ 2007, 8, 27 } =
130             $_holidays{ 2008, 8, 25 } =
131             $_holidays{ 2009, 8, 31 } =
132             $_holidays{ 2010, 8, 30 } =
133             $_holidays{ 2011, 8, 29 } =
134             $_holidays{ 2012, 8, 27 } =
135             $_holidays{ 2013, 8, 26 } =
136             $_holidays{ 2014, 8, 25 } =
137             "Summer Bank Holiday";
138              
139             $_holidays{ 2004, 12, 28 } =
140             $_holidays{ 2005, 12, 27 } =
141             $_holidays{ 2010, 12, 27 } =
142             $_holidays{ 2011, 12, 27 } =
143             "Substitute Bank Holiday in lieu of 25 Dec";
144              
145             $_holidays{ 2004, 12, 27 } =
146             $_holidays{ 2009, 12, 28 } =
147             $_holidays{ 2010, 12, 28 } = "Substitute Bank Holiday in lieu of 26 Dec";
148              
149              
150             tie %holidays, 'Date::Holidays::UK::EnglandAndWales';
151              
152             sub is_uk_holiday {
153 11 50 33 11 1 3540 shift if $_[0] eq __PACKAGE__ or ref $_[0];
154            
155 11 50       31 my ($year, $month, $day) = $#_ > 0 ? @_ : split/\D+/,$_[0],3;
156 11 50       34 $month =~ s/^0// if $month;
157 11 50       24 $day =~ s/^0// if $day;
158              
159 11 50       43 return $_holidays{ $year, $month, $day }
160             if exists $_holidays{ $year, $month, $day };
161              
162 11 50       20 if ($month == 12){
163 11 50       51 return 'Christmas Day' if $day == 25;
164 0 0         return 'Boxing Day' if $day == 26;
165             }
166 0 0         if ($month == 1){
167 0 0         return 'New Year\'s Day' if $day == 1;
168             }
169             }
170              
171             # alias
172             *is_holiday = *is_uk_holiday;
173              
174             # tie API forwards to legacy API
175             sub FETCH {
176 0     0     return is_uk_holiday( @_ );
177             }
178            
179             1;
180              
181             __END__