Dear list,

A pattern seen frequently in DateTime::Calendar-like modules is to put the 
functionality in a top-level module which holds a DateTime object to do the 
DateTime-specific stuff. If you want anything like the full DateTime 
functionality this involves writing a bunch of methods on the order of


sub some_method { $_[0]->{dt}->some_method( @_[ 1 .. $#_ ] ) }


Fortunately if I turn off strict refs the methods can be defined in a loop by 
assigning an anonymous subroutine to a glob. But the above is not the only 
subroutine template, merely the most common.


It seems to me that in at least some such cases subclassing DateTime would be a 
better alternative. But I find no documentation on how to do this. I made a 
sort of middle-level pass through http://datetime.perl.org/, and browsed the 
mailing list archives back to 2012 or so. Did I miss the documentation somehow? 
If so, could someone give me a pointer to it?


The main issue I see are:

* Where can I, in some supported way, stash any extra attribute values?

* Is there a naming convention to avoid method name conflicts (i.e. 
unintentional overrides), especially for private methods?


You can stop reading here unless you are curious about what motivated the 
question. Feel free to snip it in a reply.


My reason for asking is that I have adopted a couple modules that use this 
pattern: DateTime::Calendar::Christian and 
DateTime::Fiction::JRRTolkien::Shire. Both were missing some DateTime 
functionality of interest to me -- a lot in the latter case. A bunch of methods 
had to be written to get it, and these methods have a strong family resemblance.


When I was going through the process of adopting DateTime::Calendar::Christian 
I was offered DateTime::Calendar::Liturgical::Christian. I refused, because I 
do not have the religious background to understand the first thing about what 
feast we celebrate today or what color altar cloth to use; 
DateTIme::Calendar::Christian just does the Julian calendar before the 
conversion date and the Gregorian calendar after.


Well, I decided to take another look at 
DateTime::Calendar::Liturgical::Christian, found myself writing those same 
methods for a second or third time, and decided maybe some laziness was in 
order. I started writing a class that does not inherit from DateTime but uses 
the $self->{dt} pattern, AND that passes all the DateTime tests. This is mostly 
just drudgery, but the methods that take two DateTime arguments (e.g. 
subtract_datetime()) are turning out to be problematic. So I thought, 
belatedly, that I would look into doing the simple obvious thing rather than 
the complex obscure thing.


Thanks,

Tom Wyant

Reply via email to