NAME
    Data::TxnBuffer - binary read/write buffer supporting transaction read

SYNOPSIS
        use Data::TxnBuffer;
    
        # create buffer
        my $buf = Data::TxnBuffer->new;
        # or create buffer from some data
        my $buf = Data::TxnBuffer->new($data);
    
        # read some data
        use Try::Tiny;
        try {
            my $u32   = $buf->read_u32; # read unsigned int
            my $bytes = $buf->read(10); # read 10 bytes
    
            $buf->spin; # all data received. clear these data from buffer.
        } catch {
            $buf->reset; # reset read cursor. try again later
        };
    
        # or more easy way. this way automatically call spin or reset method like above.
        try {
            $buf->txn_read(sub {
                my $u32   = $buf->read_u32; # read unsigned int
                my $bytes = $buf->read(10); # read 10 bytes
            });
        } catch {
            # try again later
        };
    
    
        # write some data to filehandle or buffer
        $buf->write_u32(100);
        $buf->write("Hello World");
    
        # got written data
        my $data = $buf->data;
    
        # clear all data from buffer
        $buf->clear;

DESCRIPTION
    Data::TxnBuffer provides some binary buffering functions, such as basic
    read/write function for buffer, more convenience r/w methods
    (read_u32/write_u32, etc), and transaction read method.

XS implementation
    This module use XS implementation by default, but fallback to ::PP
    implementation in pure perl environment or "PERL_ONLY" environment
    variable is set.

    XS implementation is several times faster than PP implementation.

CLASS METHOD
  my $buf = Data::TxnBuffer->new($data);
    Create a Data::TxnBuffer object. If you passed some $data, create buffer
    from the data.

ACCESSORS
  $buf->cursor
    Return buffer read cursor point. This value increase by "read" methods
    automatically and reset to 0 by "reset" method.

  $buf->data
    Return buffer's whole data.

  $buf->length
    Return buffer's data length. (bytes)

BASIC METHODS
  $buf->read($bytes)
    Read $bytes data from buffer and return the data. If there's not enough
    data in buffer, throw exception.

  $buf->write($data)
    Write $data into buffer.

  $buf->spin
        $buf->write('foo');
        $buf->write('bar');
    
        my $foo = $buf->read(3); # foo
        $buf->spin; # clear only foo
    
        $buf->data; # == 'bar'

    Clear *only* read data from buffer. When read cursor == 0, this method
    does nothing.

    And also, this method returns cleared data. For example "$buf->spin" in
    above example returns 'foo';

  $buf->reset
    Reset read cursor to 0.

  $buf->clear
    Clear all data from buffer.

TRANSACTION READ
    By combination of "read", "spin", and "reset" methods, you can read some
    data like transaction:

        use Try::Tiny;
    
        try {
            my $foo = $buf->read(3);
            my $bar = $buf->read(3);
            $buf->spin; # clear read data 'foobar'
        } catch {
            $buf->reset;
        };

    "read" method throw exception if there's not enough data in buffer,
    catch this exception and reset read cursor, then you can read first data
    again after some seconds.

  $buf->txn_read($code)
    Shortcut method for above transaction read example.

        use Try::Tiny;
    
        try {
            $buf->txn_read(sub {
                my $foo = $buf->read(3);
                my $bar = $buf->read(3);
            });
            # spin automatically called
        } catch {
            # reset automatically called
            # try later
        };

    This method automatically call "spin" method and returns "spin"'ed data
    if all data successfully read, or throw exception not enough data in
    buffer and call "reset" method automatically. This method is very useful
    for typical transaction read functions.

READ/WRITE HELPER METHODS
    This module provides not only basic "read($bytes)" method but also
    useful methods to read integer values easily.

  $buf->read_u32
  $buf->read_u24
  $buf->read_u16
  $buf->read_u8
    Read unsigned integers. "uXX" is bit length. (ex: u32 is 32bit unsigned
    int)

  $buf->read_i32
  $buf->read_i24
  $buf->read_i16
  $buf->read_i8
    Read singed integers.

  $buf->write_u32
  $buf->write_u24
  $buf->write_u16
  $buf->write_u8
    Write unsigned integers

  $buf->write_i32
  $buf->write_i24
  $buf->write_i16
  $buf->write_i8
    Write signed integers

    (In XS implementation, this is just an alias to write_uXX)

  $buf->read_n32
  $buf->read_n24
  $buf->read_n16
  $buf->write_n32
  $buf->write_n24
  $buf->write_n16
    Read/Write unsigned integers in network byte order.

  $buf->read_float
  $buf->read_double
  $buf->write_float
  $buf->write_double
    Read/Write floating points (float = 32bit single precision float, double
    = 64bit double precision float)

AUTHOR
    Daisuke Murase <typester@cpan.org>

COPYRIGHT AND LICENSE
    Copyright (c) 2011 by KAYAC Inc.

    This program is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

    The full text of the license can be found in the LICENSE file included
    with this module.

