Revision ae87c27e
Von Moritz Bunkus vor fast 9 Jahren hinzugefügt
SL/DB/Helper/AttrDuration.pm | ||
---|---|---|
3 | 3 |
use strict; |
4 | 4 |
|
5 | 5 |
use parent qw(Exporter); |
6 |
our @EXPORT = qw(attr_duration); |
|
6 |
our @EXPORT = qw(attr_duration attr_duration_minutes);
|
|
7 | 7 |
|
8 | 8 |
use Carp; |
9 | 9 |
|
... | ... | |
13 | 13 |
_make($package, $_) for @attributes; |
14 | 14 |
} |
15 | 15 |
|
16 |
sub attr_duration_minutes { |
|
17 |
my ($package, @attributes) = @_; |
|
18 |
|
|
19 |
_make_minutes($package, $_) for @attributes; |
|
20 |
} |
|
21 |
|
|
16 | 22 |
sub _make { |
17 | 23 |
my ($package, $attribute) = @_; |
18 | 24 |
|
... | ... | |
75 | 81 |
}; |
76 | 82 |
} |
77 | 83 |
|
84 |
sub _make_minutes { |
|
85 |
my ($package, $attribute) = @_; |
|
86 |
|
|
87 |
no strict 'refs'; |
|
88 |
|
|
89 |
*{ $package . '::' . $attribute . '_as_hours' } = sub { |
|
90 |
my ($self, $value) = @_; |
|
91 |
|
|
92 |
$self->$attribute($value * 60 + ($self->$attribute % 60)) if @_ > 1; |
|
93 |
return int(($self->$attribute // 0) / 60); |
|
94 |
}; |
|
95 |
|
|
96 |
*{ $package . '::' . $attribute . '_as_minutes' } = sub { |
|
97 |
my ($self, $value) = @_; |
|
98 |
|
|
99 |
$self->$attribute(int($self->$attribute) - (int($self->$attribute) % 60) + ($value // 0)) if @_ > 1; |
|
100 |
return ($self->$attribute // 0) % 60; |
|
101 |
}; |
|
102 |
|
|
103 |
*{ $package . '::' . $attribute . '_as_duration_string' } = sub { |
|
104 |
my ($self, $value) = @_; |
|
105 |
|
|
106 |
if (@_ > 1) { |
|
107 |
if (!defined($value) || ($value eq '')) { |
|
108 |
$self->$attribute(undef); |
|
109 |
} else { |
|
110 |
croak $::locale->text("Invalid duration format") if $value !~ m{^(?:(\d*):)?(\d+)$}; |
|
111 |
$self->$attribute(($1 // 0) * 60 + ($2 // 0)); |
|
112 |
} |
|
113 |
} |
|
114 |
|
|
115 |
my $as_hours = "${attribute}_as_hours"; |
|
116 |
my $as_minutes = "${attribute}_as_minutes"; |
|
117 |
return defined($self->$attribute) ? sprintf('%d:%02d', $self->$as_hours, $self->$as_minutes) : undef; |
|
118 |
}; |
|
119 |
} |
|
120 |
|
|
78 | 121 |
1; |
79 | 122 |
__END__ |
80 | 123 |
|
... | ... | |
92 | 135 |
# In a Rose model: |
93 | 136 |
use SL::DB::Helper::AttrDuration; |
94 | 137 |
__PACKAGE__->attr_duration('time_estimation'); |
138 |
__PACKAGE__->attr_duration_minutes('hours'); |
|
95 | 139 |
|
96 | 140 |
# Read access: |
97 | 141 |
print "Minutes: " . $obj->time_estimation_as_minutes . " hours: " . $obj->time_estimation_as_hours . "\n"; |
... | ... | |
104 | 148 |
|
105 | 149 |
=head1 OVERVIEW |
106 | 150 |
|
107 |
This is a helper for columns that store a duration as a numeric or |
|
108 |
floating point number representing a number of hours. So the value |
|
109 |
1.75 would stand for "1 hour, 45 minutes". |
|
151 |
This is a helper for columns that store a duration in one of two formats: |
|
110 | 152 |
|
111 |
The helper methods created are: |
|
153 |
=over 2 |
|
154 |
|
|
155 |
=item 1. as a numeric or floating point number representing a number |
|
156 |
of hours |
|
157 |
|
|
158 |
=item 2. as an integer presenting a number of minutes |
|
159 |
|
|
160 |
=back |
|
161 |
|
|
162 |
In the first case the value 1.75 would stand for "1 hour, 45 |
|
163 |
minutes". In the second case the value 105 represents the same |
|
164 |
duration. |
|
165 |
|
|
166 |
The helper methods created depend on the mode. Calling |
|
167 |
C<attr_duration> makes the following methods available: |
|
112 | 168 |
|
113 | 169 |
=over 4 |
114 | 170 |
|
... | ... | |
160 | 216 |
|
161 | 217 |
=back |
162 | 218 |
|
219 |
With C<attr_duration_minutes> the following methods are available: |
|
220 |
|
|
221 |
=over 4 |
|
222 |
|
|
223 |
=item C<attribute_as_minutes [$new_value]> |
|
224 |
|
|
225 |
Access only the minutes. Return values are in the range [0 - 59]. |
|
226 |
|
|
227 |
=item C<attribute_as_hours [$new_value]> |
|
228 |
|
|
229 |
Access only the hours. Returns an integer value. |
|
230 |
|
|
231 |
=item C<attribute_as_duration_string [$new_value]> |
|
232 |
|
|
233 |
Access the full value as a formatted string in the form C<h:mm>, |
|
234 |
e.g. C<1:30> for the value 90 minutes. Parsing such a string is |
|
235 |
supported, too. |
|
236 |
|
|
237 |
=back |
|
238 |
|
|
163 | 239 |
=head1 FUNCTIONS |
164 | 240 |
|
165 | 241 |
=over 4 |
... | ... | |
169 | 245 |
Package method. Call with the names of attributes for which the helper |
170 | 246 |
methods should be created. |
171 | 247 |
|
248 |
=item C<attr_duration_minutes @attributes> |
|
249 |
|
|
250 |
Package method. Call with the names of attributes for which the helper |
|
251 |
methods should be created. |
|
252 |
|
|
172 | 253 |
=back |
173 | 254 |
|
174 | 255 |
=head1 BUGS |
Auch abrufbar als: Unified diff
AttrDuration: Implementation für Spalten, die Dauer in Minuten speichern