On Fri, Feb 26, 2010 at 12:52:44PM -0500, Steve wrote: > I've moved on to a slightly more complex situation. The same phone call > record contains two different date fields. One is a string like 'Jan > 21, 2010' (incidentally, this date is repeated for each record, as it > represents the end of the billing cycle), which I have successfully > converted with: > > type 'My::Types::Date' => as 'Str' => where { defined $_ and $_ =~ > /^\d{8}$/ }; > coerce 'My::Types::Date' => from 'Str' => via { my $d = shift; > if ($d =~ /^([a-zA-Z]+) ([0-9]+).*(\d\d\d\d)$/) { ...this code works} > > The second situation is complex. Instead of a full date with year, > month, and day of the call, I am given MM/DD. No year. I have logic > that 'figures out' the year based on the billing cycle end date (above) > which I put into &explodeDate. Being a big fan of perl's debugger, I've > identified that by the time the subroutine gets called, I have no > reference to either the date, or my object. > > elsif ($d =~ \d\d\/\d\d) {$d = &explodeDate;} > > sub explodeDate { > my $self = shift; # Nothing here... > }
Well, you're calling explodeDate as a function, not as a method. Try $self->explodeDate (or more probably, $self->explodeDate($d), since you seem to be expecting it to get the date also). Also, you shouldn't use a leading & to call regular functions, even when you're not trying to call them as methods... it's equivalent in this case, but can cause issues in other cases (particularly with functions with prototypes). > Is this proper use of coercion, or is there a better way? If I'm on the > right track, how do I get access to my object within 'explodeDate'? -doy