NAME
    IO::Slice - restrict reads to a range in a file

VERSION
    version 0.2

SYNOPSIS
       use IO::Slice;

       # Define a slice based on a file
       my $sfh = IO::Slice->new(
          filename => '/path/to/file',
          offset   => 13,
          length   => 16,
       );

       # Ditto, based on a previously available filehandle $fh. The
       # filehandle MUST be seekable.
       my $sfh = IO::Slice->new(
          fh     => $fh,
          offset => 13,
          length => 16,
       );

       # Both the filehandle and the filename can be provided. The
       # filehandle will win.
       my $sfh = IO::Slice->new(
          fh       => $fh,
          filename => '/path/to/file',
          offset   => 13,
          length   => 16,
       );

       # Whatever, you can use $sfh as any other filehandle, mostly.

DESCRIPTION
    This module allows the definition of a filehandle that only works on a
    slice of an input file. The "new" method provides back a GLOB that can
    be used as any other filehandle, mostly, with the notable exception of
    some methods like "stat", "fileno" and the tracking of the input lines.

       my $sfh = IO::Slice->new(
          filename => '/path/to/file',
          offset   => 13,
          length   => 16,
       );

    The provided handle works only for reading, not for writing.

    The parameters that you can pass to the constructor are:

    *   the source of data. This can be provided by either a filename
        (through the "filename" key) or a filehandle (through the "fh" key).
        If both are provided, the filehandle will take precedence for
        getting the data.

    *   the "offset", specifying an offset where the slice starts. 0 means
        the start of the file

    *   the "length", specifying the number of bytes in the slice

METHODS
  new
    create a new IO::Slice object.

    Parameters can be passed either as an hash reference or key-value pairs.
    Useful parameters are:

    "offset"
        set the offset of the slice from the start of file. This is
        mandatory

    "length"
        set the length of the slice. This is mandatory.

    Neither "offset" nor "length" are tested for correctness against the
    file.

    You have to provide at least one of "fh" and "filename" so that the data
    source can be reached. If you provide both, "fh" will used for taking
    the data.

    Returns the object. Throws an exception in case of errors.

  open
    open a slice. Parameters are the same as the "new" method.

  close
    close the tied handle and the associated object.

  opened
    assess whether the object is associated to an opened file

  binmode
    support the binmode method... but in a fake way, does not accept
    anything actually.

  getc
    get one byte from the input stream.

  ungetc
    release one byte back into the input stream

  eof
    test whether there are still bytes to read or we are at the end of the
    file

  pos
    accessor for the position. It allows you to set the position by passing
    an input parameter, and to retrieve the current position.

  seek
    set current position in the stream. Two positional parameters are
    accepted:

    *   offset

        specifies the offset to use

    *   whence

        specifies the reference point for applying the offset

    Both are consistent with what you find in CORE::seek documentation.

  tell
    get current position in the stream.

  do_read
    convenience function around "read". Takes as input the count of needed
    bytes and outputs a string that is the result of the underlying "read",
    without requiring you to provide a buffer.

  getline
    get a line from the input. Returns a single scalar with one line.

    This honors $/ (aka $INPUT_RECORD_SEPARATOR), so *line* might not be
    what you generally consider a line.

  getlines
    list-version for getting lines, propedeutic to READLINE

  read
    read bytes from the stream. The interface is the same as the CORE::read
    function, with the following positional parameters:

    *   filehandle

        mandatory parameter

    *   buffer

        mandatory parameter

    *   offset

        optional parameter, used for putting data into the buffer

    Returns undef if errors arise or end of file. Returns number of read
    characters otherwise (0 if end of file).

  sysseek
    alias of "seek"

  sysread
    alias for "read"

  Nullified Functions
    The following functions are defined but don't actually do anything.

    print
    printflush
    printf
    fileno
    error
    clearerr
    sync
    write
    setbuf
    setvbuf
    untaint
    autoflush
    fcntl
    ioctl
    input_line_number

SEE ALSO
    This module is heavily inspired (and in some places based) on code from
    "IO::String" 1.08 by Gisle Aas.

AUTHOR
    Flavio Poletti <polettix@cpan.org>

COPYRIGHT AND LICENSE
    Copyright (C) 2014 by Flavio Poletti <polettix@cpan.org>

    This module is free software. You can redistribute it and/or modify it
    under the terms of the Artistic License 2.0.

    This program is distributed in the hope that it will be useful, but
    without any warranty; without even the implied warranty of
    merchantability or fitness for a particular purpose.

