--- AnyEvent/lib/AnyEvent/Handle.pm 2008/06/06 10:49:20 1.62 +++ AnyEvent/lib/AnyEvent/Handle.pm 2008/06/06 11:00:32 1.63 @@ -546,6 +546,21 @@ : JSON::encode_json ($ref) }; +=item storable => $reference + +Freezes the given reference using L and writes it to the +handle. Uses the C format. + +=cut + +register_write_type storable => sub { + my ($self, $ref) = @_; + + require Storable; + + pack "w/a", Storable::nfreeze ($ref) +}; + =back =item AnyEvent::Handle::register_write_type type => $coderef->($handle, @args) @@ -1047,7 +1062,7 @@ =cut register_read_type json => sub { - my ($self, $cb, $accept, $reject, $skip) = @_; + my ($self, $cb) = @_; require JSON; @@ -1072,6 +1087,40 @@ } }; +=item storable => $cb->($handle, $ref) + +Deserialises a L frozen representation as written by the +C write type (BER-encoded length prefix followed by nfreeze'd +data). + +Raises C error if the data could not be decoded. + +=cut + +register_read_type storable => sub { + my ($self, $cb) = @_; + + require Storable; + + sub { + # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method + defined (my $len = eval { unpack "w", $_[0]->{rbuf} }) + or return; + + # remove prefix + substr $_[0]->{rbuf}, 0, (length pack "w", $len), ""; + + # read rest + $_[0]->unshift_read (chunk => $len, sub { + if (my $ref = eval { Storable::thaw ($_[1]) }) { + $cb->($_[0], $ref); + } else { + $self->_error (&Errno::EBADMSG); + } + }); + } +}; + =back =item AnyEvent::Handle::register_read_type type => $coderef->($handle, $cb, @args)