## Luke Hutscal ## Started November 12 2007 ## Finished November 13 or so. ## Added display order setting on the 14th. package My::Module; use 5.008008; use strict; use warnings; our $VERSION = '0.04'; # Preloaded methods go here. ## These are my local subs ## users should not be able to get at them. my $processInterval = sub { my $self = shift; my($var,$plural,$singular) = @$_; if($var > 0) { my %entry; $entry{value} = $var; $entry{word} = $var > 1 ? $self->{$plural} : $self->{$singular}; return \%entry; } return undef; }; sub new { my $self = shift; my $defaults = {}; ## here we set the default values for our module. %$defaults = ( second => 'second', seconds => 'seconds', minute => 'minute', minutes => 'minutes', hour => 'hour', hours => 'hours', day => 'day', days => 'days', week => 'week', weeks => 'weeks', month => 'month', months => 'months', year => 'year', years => 'years', display => 2, # This is how many are displayed by default order => 'desc', # this is the order things are displayed in @_ # load in all the options passed to us ); bless $defaults, $self; } sub parse_seconds { my $self = shift; my $seconds = shift; my $display = shift; my $parsed; my($minutes,$hours,$days,$weeks,$years); ## We don't have any months because it's harder - 12 months, but 52 weeks makes for 13. See? # minutes $minutes = int($seconds/60); $seconds-=$minutes*60; # hours $hours = int($minutes/60); $minutes-=$hours*60; # days $days = int($hours/24); $hours-=$days*24; # weeks $weeks = int($days/7); $days-=$weeks*7; # years $years = int($weeks/52); $weeks-=$years*52; my @output; ## We add our intervals in this order, so that we can have output show up from largest to smallest. my @intervals = ( [$years,'years','year'], [$weeks,'weeks','week'], [$days,'days','day'], [$hours,'hours','hour'], [$minutes,'minutes','minute'], [$seconds,'seconds','second'], ); # By default, we're displaying in descending order. However, if the user has specified # ascending order, we reverse the order we'll be handling our array in. ## This is done with a regex so that users can supply "asc", "ascend", "ascending", and still have ## everything work properly. if ($self->{order} =~ /^asc/) { @intervals = reverse @intervals; } # thanks Andrew! @output = grep {defined} map { $processInterval->($self,$_) } @intervals; for(my $i = 0; $i < ($display ? $display : $self->{display}) && $i < @output; $i++) { ## padding our output my $padding = $i > 0 ? ' ' : ''; my $ending = ($i < ($display ? ($display-1) : ($self->{display}-1))) && ($i < (@output-1)) ? ',' : ''; $parsed .= $padding . $output[$i]->{'value'} . ' ' . $output[$i]->{'word'} . $ending; } return $parsed; } 1;