package Mojo::Server::Morbo::Backend;
use Mojo::Base -base;

use Carp qw(croak);

has watch         => sub { [qw(lib templates)] };
has watch_timeout => sub { $ENV{MOJO_MORBO_TIMEOUT} || 1 };

sub modified_files { croak 'Method "modified_files" not implemented by subclass' }

1;

=encoding utf8

=head1 NAME

Mojo::Server::Morbo::Backend - Morbo backend base class

=head1 SYNOPSIS

  package Mojo::Server::Morbo::Backend::Inotify:
  use Mojo::Base 'Mojo::Server::Morbo::Backend';

  sub modified_files {...}

=head1 DESCRIPTION

L<Mojo::Server::Morbo::Backend> is an abstract base class for Morbo backends, like
L<Mojo::Server::Morbo::Backend::Poll>.

=head1 ATTRIBUTES

L<Mojo::Server::Morbo::Backend> implements the following attributes.

=head2 watch

  my $watch = $backend->watch;
  $backend  = $backend->watch(['/home/sri/my_app']);

Files and directories to watch for changes, defaults to the application script as well as the C<lib> and C<templates>
directories in the current working directory.

=head2 watch_timeout

  my $timeout = $backend->watch_timeout;
  $backend    = $backend->watch_timeout(10);

Maximum amount of time in seconds a backend may block when waiting for files to change, defaults to the value of the
C<MOJO_MORBO_TIMEOUT> environment variable or C<1>.

=head1 METHODS

L<Mojo::Server::Morbo::Backend> inherits all methods from L<Mojo::Base> and implements the following new ones.

=head2 modified_files

  my $files = $backend->modified_files;

Check if files from L</"watch"> have been modified since the last check and return an array reference with the results.
Meant to be overloaded in a subclass.

  # All files that have been modified
  say for @{$backend->modified_files};

=head1 SEE ALSO

L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.

=cut