CSS-Watcher

 view release on metacpan or  search on metacpan

lib/CSS/Watcher/Monitor.pm  view on Meta::CPAN

package CSS::Watcher::Monitor;

use strict;
use warnings;

use Carp;
use Log::Log4perl qw(:easy);
use File::Spec;
use Fcntl ':mode';
use List::MoreUtils qw(any);

our @STAT_FIELDS = qw(
                         dev inode mode num_links uid gid rdev size atime mtime ctime
                         blk_size blocks
             );

sub new {
    my $class= shift;
    my $options = shift;

    return bless ({
        dir => $options->{dir} // undef,
        oldstats => {},
    }, $class);
}

sub dir {
    my $self = shift;
    croak "dir attribute is read-only" if @_;
    return $self->{dir};
}

sub scan {
    my ($self, $callback, $skip_dirs) = @_;

    return 0 unless (defined $callback && defined $self->dir && -d $self->dir);

    my $newstat = $self->_get_files_info( $self->dir, $skip_dirs );

    my $changes = 0;
    while ( my( $fname, $stat ) = each %{$newstat->{files}} ) {
        unless ($self->_deep_compare ($self->_get_stat ($fname), $stat )) {
            $self->_set_stat ($fname, $stat);
            $callback->($fname);
            $changes++;
        }
    }
    return $changes;
}

sub is_changed {
    my ( $self, $filename ) = @_;
    my %objstat;
    @objstat{@STAT_FIELDS} = stat ( $filename );

    # this file may never present before and not exist, return false
    return 0 unless (defined ($objstat{atime}) && -f $filename);

    not $self->_deep_compare (
        $self->_get_stat ($filename),
        \%objstat);
}

sub make_dirty {
    my $self = shift;
    $self->{oldstats} = {};
}

sub _get_stat {
    my ( $self, $filename ) = @_;
    return $self->{oldstats}{$filename} // {};
}



( run in 2.083 seconds using v1.01-cache-2.11-cpan-5735350b133 )