The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Log::Message::Structured::Component::Date;
use Moose::Role;
use namespace::autoclean;

use DateTime;
use MooseX::Types::ISO8601 qw/ ISO8601DateTimeStr /;

my $GETOPT = do { local $@; eval { require MooseX::Getopt; 1 } };

has epochtime => (
    isa => 'Int',
    is => 'ro',
    default => sub { time() },
    $GETOPT ? ( traits => [qw/ NoGetopt /] ) : (),
);

has date => (
    is => 'ro',
    isa => ISO8601DateTimeStr,
    lazy => 1,
    default => sub { DateTime->from_epoch(epoch => shift()->epochtime) },
    coerce => 1,
    $GETOPT ? ( traits => [qw/ NoGetopt /] ) : (),
);

after BUILD => sub { shift()->date };

1;

__END__

=pod

=head1 NAME

Log::Message::Structured::Component::Date

=head1 SYNOPSIS

    package MyLogEvent;
    use Moose;
    use namespace::autoclean;

    with qw/
        Log::Message::Structured
        Log::Message::Structured::Component::Date
    /;

    has foo => ( is => 'ro', required => 1 );

    ... elsewhere ...

    use aliased 'My::Log::Event';

    $logger->log(message => Event->new( foo => "bar" ));
    # Logs:
    {"__CLASS__":"MyLogEvent","foo":1,"date":"2010-03-28T23:15:52Z"}

=head1 DESCRIPTION

Provides C<'epochtime'> and C<'date'> attributes to the consuming class ( that should also
consume L<Log::Message::Structured>).

=head1 METHODS

=head2 BUILD

The BUILD method is wrapped to make sure the date is inflated at
construction time.

=head1 ATTRIBUTES

=head2 date

The date and time on which the event occured, as an ISO8601 date time string
(from L<MooseX::Types::ISO8601>). Defaults to the time the object is
constructed.

=head2 epochtime

The date and time on which the event occurred, as an no of seconds since Jan
1st 1970 (i.e. the output of time()). Defaults to the time the object is
constructed.

=head1 AUTHOR AND COPYRIGHT

Damien Krotkine (dams) C<< <dams@cpan.org> >>.

=head1 LICENSE

Licensed under the same terms as perl itself.

=cut