has delay => (is => 'rw');
has regex => (is => 'rw');
-has modified => (is => 'rw');
+has modified => (is => 'rw', builder => '_build_modified', lazy => 1);
has directory => (is => 'rw');
-has watch_list => (is => 'rw');
+has watch_list => (is => 'rw', builder => '_build_watch_list', lazy => 1);
has follow_symlinks => (is => 'rw');
-sub BUILD {
- shift->_init;
+sub _build_watch_list {
+ my ($self) = @_;
+ return $self->_index_directory;
}
-sub _init {
- my $self = shift;
-
- my $watch_list = $self->_index_directory;
- $self->watch_list($watch_list);
-
- $self->modified(
- File::Modified->new(
- method => 'mtime',
- files => [ keys %{$watch_list} ],
- )
+sub _build_modified {
+ my ($self) = @_;
+ return File::Modified->new(
+ method => 'mtime',
+ files => [ keys %{ $self->watch_list } ],
);
}
$id = B::Hooks::OP::Check::StashChange::register(sub {
my ($new, $old) = @_;
my $meta = find_meta($new);
- if ($meta) {
- $meta->make_mutable if $meta->is_immutable;
+ if ($meta) { # A little paranoia here - Moose::Meta::Role has neither of these methods.
+ my $is_immutable = $meta->can('is_immutable');
+ my $make_mutable = $meta->can('make_mutable');
+ $meta->$make_mutable() if $is_immutable && $make_mutable && $meta->$is_immutable();
+ eval { # Do not explode the watcher process if this fails.
+ my $superclasses = $meta->can('superclasses');
+ $meta->$superclasses('Moose::Object') if $superclasses;
+ };
}
});
}
+ local $Catalyst::__AM_RESTARTING = 1; # Hack to avoid C3 fail
delete $INC{$file}; # Remove from %INC so it will reload
local $SIG{__WARN__} = sub { };
Returns a list of files that have been added, deleted, or changed since the
last time watch was called.
+=head2 DETECT_PACKAGE_COMPILATION
+
+Returns true if L<B::Hooks::OP::Check::StashChange> is installed and
+can be used to detect when files are compiled. This is used internally
+to make the L<Moose> metaclass of any class being reloaded immutable.
+
+If L<B::Hooks::OP::Check::StashChange> is not installed, then the
+restarter makes all application components immutable. This covers the
+simple case, but is less useful if you're using Moose in components
+outside Catalyst's namespaces, but inside your application directory.
+
=head1 SEE ALSO
L<Catalyst>, L<Catalyst::Engine::HTTP::Restarter>, L<File::Modified>