# NAME
KelpX::AppBuilder - Create re-usable apps with Kelp
# SYNOPSIS
KelpX::AppBuilder makes it trivial to reuse your entire route map and views in an entirely new Kelp application. You create a base app, which can still be run normally, and from there you can start a new project and reuse everything from your base app without duplicating things.
# USAGE
First off, we'll need to modify the structure so File::ShareDir knows where to find our views/assets globally. It should look something like this
```
BaseApp/lib/auto/BaseApp/views
BaseApp/lib/auto/BaseApp/assets
```
You don't have to use the same names, just the structure.
Then, in your base application
```perl
package BaseApp;
use Kelp::Base 'Kelp';
use KelpX::AppBuilder 'Base';
# we don't need a build method, KelpX::AppBuilder will automatically
# create it based on what we define in the maps method
sub maps {
{
'/' => BaseApp::Controller::Root->can('index'),
'/login' => BaseApp::Controller::Auth->can('login'),
'/accounts/manage/:id' => {
to => BaseApp::Controller::Accounts->can('manage'),
bridge => 1
},
'/accounts/manage/:id/view', BaseApp::Controller::Accounts->can('view'),
}
}
1;
```
Optionally you can include an 'auto' method into your application. The auto method gets called before every single page, so it's handy to use to ensure a user is logged in. You can do this by adding
'auto' => 1
to your maps hash ref. It will handle the route line and bridging for you. Don't forget to create the auto method in BaseApp::Controller::Root if you enable this though! An example:
```perl
package BaseApp::Controller::Root;
sub auto {
my ($self) = @_;
my $url = $self->named->{page};
unless ($url eq 'login') {
if (my $user = $self->user) {
return 1;
}
return;
}
return 1;
}
```
We'll call our new app 'TestApp' (original, eh?). Copy across your config from BaseApp into your TestApp conf, then use File::ShareDir so your Template::Toolkit knows where to find the views for both applications.
```perl
my $path = File::ShareDir::module_dir( 'BaseApp' );
middleware_init => {
Static => {
path => qw{^/assets/|^/apps/},
root => $path,
},
...
},
# use local views, and the one from BaseApp
'Template::Toolkit' => {
ENCODING => 'utf8',
INCLUDE_PATH => [
'./views',
$path . '/views'
],
RELATIVE => 1,
TAG_STYLE => 'asp',
},
```
The final part is loading your BaseApp controllers into your TestApp. That's fairly easy.
```perl
package TestApp;
use Kelp::Base 'Kelp';
use KelpX::AppBuilder;
sub build {
my ($self) = @_;
my $r = $self->routes;
KelpX::AppBuilder->new('BaseApp')->add_maps($r);
# now you can add TestApp's own routing
$r->add('/hello', sub { "Hello, world!" });
}
1;
```
Congratulations. You've just reused the controllers from your BaseApp.
# PLEASE NOTE
This module is still a work in progress, so I would advise against using KelpX::AppBuilder in a production environment. I'm still looking at ways to make KelpX::AppBuilder more user friendly, but unfortunately reusing an application is not a simple process :-)
# AUTHOR
Brad Haywood
# LICENSE
You may distribute this code under the same terms as Perl itself.