f267866f61bc4396541a20718d65052738183f08
[catagits/Catalyst-Devel.git] / lib / Catalyst / Watcher.pm
1 package Catalyst::Watcher;
2
3 use Moose;
4 use Moose::Util::TypeConstraints;
5
6 use Cwd qw( abs_path );
7 use File::Spec;
8 use FindBin;
9 use namespace::clean -except => 'meta';
10
11 has regex => (
12     is      => 'ro',
13     isa     => 'RegexpRef',
14     default => sub { qr/(?:\/|^)(?!\.\#).+(?:\.yml|\.yaml|\.conf|\.pm)$/ },
15 );
16
17 my $dir = subtype
18        as 'Str'
19     => where { -d $_ }
20     => message { "$_ is not a valid directory" };
21
22 my $array_of_dirs = subtype
23        as 'ArrayRef[Str]',
24     => where { map { -d } @{$_} }
25     => message { "@{$_} is not a list of valid directories" };
26
27 coerce $array_of_dirs
28     => from $dir
29     => via { [ $_ ] };
30
31 has directories => (
32     is      => 'ro',
33     isa     => $array_of_dirs,
34     default => sub { [ abs_path( File::Spec->catdir( $FindBin::Bin, '..' ) ) ] },
35     coerce  => 1,
36 );
37
38 has follow_symlinks => (
39     is      => 'ro',
40     isa     => 'Bool',
41     default => 0,
42 );
43
44 sub instantiate_subclass {
45     my $class = shift;
46
47     if ( eval { require Catalyst::Watcher::Inotify; 1; } ) {
48         return Catalyst::Watcher::Inotify->new(@_);
49     }
50     else {
51         die $@ if $@ && $@ !~ /Can't locate/;
52         require Catalyst::Watcher::FileModified;
53         return Catalyst::Watcher::FileModified->new(@_);
54     }
55 }
56
57 __PACKAGE__->meta->make_immutable;
58
59 1;