# $Id$ package Mvalve::Message; use Moose; use Moose::Util::TypeConstraints; use MooseX::ClassAttribute; use Data::Serializer; use Digest::SHA1 (); use HTTP::Headers; use POSIX(); use Sys::Hostname(); use Time::HiRes(); class_type 'HTTP::Headers'; coerce 'HTTP::Headers' => from 'HashRef', => via { HTTP::Headers->new(%$_) } ; has 'id' => ( is => 'ro', isa => 'Str', required => 1, default => sub { # XXX - hints as to about when this message was generated my ($int_part, $float_part) = split(/\./, Time::HiRes::time()); my $prefix = join('.', POSIX::strftime('%Y%m%d%H%M%S', localtime($int_part)), $float_part); return join('-', $prefix, Digest::SHA1::sha1_hex({}, $$, Time::HiRes::time(), rand(), Sys::Hostname::hostname())) } ); has 'headers' => ( is => 'rw', isa => 'HTTP::Headers', coerce => 1, default => sub { HTTP::Headers->new }, handles => { header => 'header', header_add => 'push_header', header_remove => 'remove_header' }, ); has 'content' => ( is => 'rw', ); class_has 'SERIALIZER' => ( is => 'rw', isa => 'Data::Serializer', lazy => 1, default => sub { Data::Serializer->new( serializer => 'Storable', compress => 1, ) }, ); __PACKAGE__->meta->make_immutable; no Moose; no MooseX::ClassAttribute; sub serialize { my $rv = eval { $_[0]->SERIALIZER->serialize($_[0]) }; Carp::confess("Failed to serialize @_: $@") if $@; return $rv; } sub deserialize { my $rv = eval { shift->SERIALIZER->deserialize(@_) }; Carp::confess("Failed to deserialize @_: $@") if $@; return $rv; } 1; __END__ =head1 NAME Mvalve::Message - A Message Object =head1 SYNOPSIS use Mvalve::Message; my $message = Mvalve::Message->new( headers => { from => 'me', to => 'you', }, content => { random => 'content', } ); my $serialized = $message->serialize; my $materialized = Mvalve::Message->deserialize($serialized); =head1 METHODS =head2 BUILD Custom BUILD() for Moose =head2 SERIALIZER Returns the serializer object to use =head2 serialize Serializes the message =head2 deserialize Deserializes a packed structure to a message =cut