I didn't read the first email properly -- I think what you want to do is this:
in WebApp.pm:
package WebApp;
use Dancer2 appname => 'test';
# plus the other dependencies
hook before => sub {
if (!session('user') && request->dispatch_path !~ m{^/login}) {
forward '/login', { requested_path => request->dispatch_path };
}
};
get '/' => sub { template 'index'; };
get '/index' => sub { redirect '/' };
# etc.
1;
in WebApp::API.pm:
package WebApp::API;
use Dancer2 appname => 'test';
# handles everything under /api
prefix '/api' => sub {
any ['get', 'post'] => '/userdata/:user' => sub {
my $user_value = route_parameters->get('user');
my $user = database->quick_select('users', { username => $user_value });
# etc.
};
};
1;
in app.psgi:
use WebApp;
use WebApp::API;
mount '/' => WebApp->to_app # note that WebApp::API->to_app also works here
};
To make life even easier for yourself, you can make a wrapper to hold your various route modules:
package WebAppWrap;
use Dancer2 appname => 'test';
use WebApp;
use WebApp::API;
use WebApp::JSON;
use WebApp::Complex::Package; # each of these modules has appname 'test'
# etc.
in app.psgi:
use WebAppWrap;
builder {
mount '/' => WebAppWrap->to_app # pulls in all loaded modules with appname 'test'
};