1use strict; 2use warnings; 3 4use Test::More; 5 6use DateTime::Format::Builder; 7 8{ 9 my $sample = 'SampleClassWithSelf'; 10 DateTime::Format::Builder->create_class( 11 class => $sample, 12 parsers => { 13 parse_datetime => [ 14 [ 15 preprocess => sub { 16 my %p = @_; 17 my $self = $p{self}; 18 $p{parsed}->{time_zone} = $self->{global} 19 if $self->{global}; 20 return $p{input}; 21 }, 22 ], 23 { 24 params => [qw( year month day hour minute second )], 25 regex => qr/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)$/, 26 preprocess => sub { 27 my %p = @_; 28 my $self = $p{self}; 29 $p{parsed}->{time_zone} = $self->{pre} 30 if $self->{pre}; 31 return $p{input}; 32 }, 33 postprocess => sub { 34 my %p = @_; 35 my $self = $p{self}; 36 $p{parsed}->{time_zone} = $self->{post} 37 if $self->{post}; 38 return 1; 39 }, 40 }, 41 ], 42 } 43 ); 44 45 my %tests = ( 46 global => 'Africa/Cairo', 47 pre => 'Europe/London', 48 post => 'Australia/Sydney', 49 ); 50 51 while ( my ( $callback, $value ) = each %tests ) { 52 my $parser = $sample->new(); 53 $parser->{$callback} = $value; 54 my $dt = $parser->parse_datetime("20030716T163245"); 55 is( $dt->time_zone->name, $value ); 56 } 57} 58 59done_testing(); 60