File::ChangeNotify - Watch for changes to files, cross-platform style


File-ChangeNotify documentation Contained in the File-ChangeNotify distribution.

Index


Code Index:

NAME

Top

File::ChangeNotify - Watch for changes to files, cross-platform style

VERSION

Top

version 0.20

SYNOPSIS

Top

    use File::ChangeNotify;

    my $watcher =
        File::ChangeNotify->instantiate_watcher
            ( directories => [ '/my/path', '/my/other' ],
              filter      => qr/\.(?:pm|conf|yml)$/,
            );

    if ( my @events = $watcher->new_events() ) { ... }

    # blocking
    while ( my @events = $watcher->wait_for_events() ) { ... }

DESCRIPTION

Top

This module provides an API for creating a File::ChangeNotify::Watcher subclass that will work on your platform.

Most of the documentation for this distro is in File::ChangeNotify::Watcher.

METHODS

Top

This class provides the following methods:

File::ChangeNotify->instantiate_watcher(...)

This method looks at each available subclass of File::ChangeNotify::Watcher and instantiates the first one it can load, using the arguments you provided.

It always tries to use the File::ChangeNotify::Watcher::Default class last, on the assumption that any other class that is available is a better option.

File::ChangeNotify->usable_classes()

Returns a list of all the loadable File::ChangeNotify::Watcher subclasses.

BUGS

Top

Please report any bugs or feature requests to bug-file-changenotify@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

DONATIONS

Top

If you'd like to thank me for the work I've done on this module, please consider making a "donation" to me via PayPal. I spend a lot of free time creating free software, and would appreciate any support you'd care to offer.

Please note that I am not suggesting that you must do this in order for me to continue working on this particular software. I will continue to do so, inasmuch as I have in the past, for as long as it interests me.

Similarly, a donation made in this way will probably not make me work on this software much more, unless I get so many donations that I can consider working on free software full time, which seems unlikely at best.

To donate, log into PayPal and send money to autarch@urth.org or use the button on this page: http://www.urth.org/~autarch/fs-donation.html

AUTHOR

Top

Dave Rolsky <autarch@urth.org>

COPYRIGHT AND LICENSE

Top


File-ChangeNotify documentation Contained in the File-ChangeNotify distribution.

package File::ChangeNotify;
BEGIN {
  $File::ChangeNotify::VERSION = '0.20';
}

use strict;
use warnings;

use Carp qw( confess );
use Class::MOP;
# We load this up front to make sure that the prereq modules are installed.
use File::ChangeNotify::Watcher::Default;
use Module::Pluggable::Object;

sub instantiate_watcher {
    my $class = shift;

    for my $class ( $class->usable_classes() ) {
        if ( _try_load($class) ) {
            return $class->new(@_);
        }
    }

    return File::ChangeNotify::Watcher::Default->new(@_);
}

{
    my @usable_classes = ();

    sub usable_classes {
        my $class = shift;

        return @usable_classes if @usable_classes;
        return @usable_classes
            = grep { _try_load($_) } $class->_all_classes();
    }
}

{
    my %tried;

    sub _try_load {
        my $class = shift;

        return $tried{$class}
            if exists $tried{$class};

        eval { Class::MOP::load_class($class) };

        my $e = $@;
        die $e if $e && $e !~ /Can\'t locate|did not return a true value/;

        return $tried{$class} = $e ? 0 : 1;
    }
}

my $finder = Module::Pluggable::Object->new(
    search_path => 'File::ChangeNotify::Watcher' );

sub _all_classes {
    return
        sort grep { $_ ne 'File::ChangeNotify::Watcher::Default' }
        $finder->plugins();
}

1;

# ABSTRACT: Watch for changes to files, cross-platform style




__END__