NAME

IO::Any - open anything

SYNOPSIS

        # NOTE commented out lines doesn't work (jet)
        use IO::Any;

        $fh = IO::Any->read('filename');
        $fh = IO::Any->read('file://var/log/syslog');
        #$fh = IO::Any->read('http://search.cpan.org/');
        #$fh = IO::Any->read('-');
        $fh = IO::Any->read(['folder', 'other-folder', 'filename']);
        $fh = IO::Any->read('folder');
        $fh = IO::Any->read("some text\nwith more lines\n");
        $fh = IO::Any->read(\"some text\nwith more lines\n");
        $fh = IO::Any->read('{"123":[1,2,3]}');
        $fh = IO::Any->read('<root><element>abc</element></root>');
        $fh = IO::Any->read(*DATA);
        #$fh = IO::Any->read(IO::String->new("cba"));
        #$fh = IO::Any->read($object_with_toString_method);

        $fh = IO::Any->write('filename');
        $fh = IO::Any->write('file://var/log/syslog');
        #$fh = IO::Any->write('-');
        $fh = IO::Any->write(['folder', 'filename']);
        #$fh = IO::Any->write('=');
        my $string;
        $fh = IO::Any->write(\$string);

        my $content = IO::Any->slurp(['folder', 'filename']);
        IO::Any->spew(['folder2', 'filename'], $content);

        perl -MIO::Any -le 'print IO::Any->slurp("/etc/passwd")'
        perl -MIO::Any -le 'IO::Any->spew("/tmp/timetick", time())'

DESCRIPTION

The aim is to provide read/write anything. The module tries to guess `$what' the "anything" is based on some rules. See new method Pod for examples and the new and guesswhat entries elsewhere in this document code for the implementation.

There are two methods the slurp and spew entries elsewhere in this document to read/write whole `$what'.

MOTIVATION

The purpose is to be able to write portable one-liners (both commandline and inside program) to read/write/slurp/spew files/strings/$what-ever. As I'm sick of writing `File::Spec->catfile('folder', 'filename')' or `use Path::Class; dir(); file();'.

First time I've used IO::Any for JSON::Util where for the function to encode and decode files I can just say put as an argumen anything that IO::Any accepts. It's then up to the users of that module to pass an array if it's a file, scalar ref if it is a string or relay on the module to guess $what.

Any suggestions, questions and also demotivations are more than welcome!

METHODS
new($what, $how, $options)
Open `$what' in `$how' mode.

`$what' can be:

                    'filename'                => [ 'file' => 'filename' ],
                    'folder/filename'         => [ 'file' => 'folder/filename' ],
                    'file:///folder/filename' => [ 'file' => '/folder/filename' ],
                    [ 'folder', 'filename' ]  => [ 'file' => File::Spec->catfile('folder', 'filename') ],
                    'http://a/b/c'            => [ 'http' => 'http://a/b/c' ],
                    'https://a/b/c'           => [ 'http' => 'https://a/b/c' ],
                    '{"123":[1,2,3]}'         => [ 'string' => '{"123":[1,2,3]}' ],
                    '[1,2,3]'                 => [ 'string' => '[1,2,3]' ],
                    '<xml></xml>'             => [ 'string' => '<xml></xml>' ],
                    "a\nb\nc\n"               => [ 'string' => "a\nb\nc\n" ],
                    *DATA                     => [ 'file' => *{DATA}{IO} ],

Returns filehandle. IO::String for 'string', IO::File for 'file'. 'http' not implemented jet :)

Here are alvailable `%$options' options:

        atomic    true/false if the file operations should be done using L<IO::AtomicFile> or L<IO::File>
        LOCK_SH   lock file for shared access
        LOCK_EX   lock file for exclusive
        LOCK_NB   lock file non blocking (will throw an excpetion if file is
                      already locked, instead of blocking the process)

guesswhat
Returns ($type, $what). $type can be:

        file
        string
        http
        iostring
        iofile

`$what' is normalized path that can be used for IO::*.

read($what)
Same as `IO::Any->new($what, '<');' or `IO::Any->new($what);'.

write($what)
Same as `IO::Any->new($what, '>');'

slurp($what)
Returns content of `$what'.

If AnyEvent is loaded then uses event loop to read the content.

spew($what, $data, $opt)
Writes `$data' to `$what'.

If AnyEvent is loaded then uses event loop to write the content.

SEE ALSO

IO::All, File::Spec, Path::Class

AUTHOR

Jozef Kutej, `<jkutej at cpan.org>'

BUGS

Please report any bugs or feature requests to `bug-io-any at rt.cpan.org', or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=IO-Any. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc IO::Any

You can also look for information at:

ACKNOWLEDGEMENTS
COPYRIGHT & LICENSE

Copyright 2009 Jozef Kutej, all rights reserved.

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