NAME
Leyland::Manual::Extending - How to extend Leyland
EXTENDING THE CONTEXT CLASS
The context class (Leyland::Context) constitutes the most of Leyland's API provided for your applications. It follows a request during its entire lifetime. It is very likely that you'd like that class to have attributes and methods which are specific to your application, such as an attribute that holds a database connection object for example.
If so needed, Leyland gives you the ability to easily extend the base context class. Since it is Moo based, you can create a class that extends
it, and tell Leyland to use it as the application's context class.
For example, our application can have the following class:
package MyApp::Context;
use Moo;
use namespace::clean;
extends 'Leyland::Context';
has 'db' => (is => 'ro', writer => '_set_db');
around 'loc' => sub {
my ($orig, $self) = (shift, shift);
# change the behavior of the loc() method
};
1;
And we can tell Leyland to use it as the context class when initiating an instance of our class in app.psgi
:
my $myapp = MyApp->new(context_class => 'MyApp::Context');
But how do you populate the db
attribute we see in the above example? Most likely with the root controller's auto()
method:
# MyApp/Controller/Root.pm
sub auto {
my ($self, $c) = @_;
$c->_set_db(SomeDatabaseClass->new);
}
Leyland also allows classes that extend Leyland::Context
to define a method called finalize
. This method is called right before a response is sent to the client (but only before successful responses, not exceptions), after serialization (if performed). The method receives a reference to the returned output (which will be scalar). The reason a reference is passed to the method is to allow it to modify it. A simple example would be:
# in MyApp/Context.pm
sub finalize {
my ($c, $ret) = @_;
$$ret =~ s/John/Michael/g;
}
Of course, be careful if you decide to modify any of Leyland::Context's methods so as not to break its behavior.
EXTENDING LEYLAND
If you find that Leyland lacks support for your preferred CPAN modules, such as template engines, you are more than welcome to create these classes by yourself. View classes are expected to consume Leyland::View, which describes how view classes should be created. Look at Leyland::View::Tenjin for an example.
If you want to go even further, since Leyland is entirely Moo(se) based, and if you're crazy enough, you can use Moo(se) tricks and modifications to make Leyland behave the way you want it, and maybe even create your own application framework on top of Leyland.
HELPING WITH DEVELOPMENT
You are more than welcome to help with the development of Leyland, even by simply submitting suggestions and bug reports. Refer to "BUGS" in Leyland and "SUPPORT" in Leyland for more information on submitting bug reports. Leyland development is version controlled via GitHub, at http://github.com/ido50/Leyland. If you're also using GitHub, feel free to fork Leyland, send me pull requests, etc.
WHAT'S NEXT?
Refer to Leyland::Manual::FAQ for frequently asked questions and their answers, or return to the table of contents.
AUTHOR
Ido Perlmuter, <ido at ido50.net>
BUGS
Please report any bugs or feature requests to bug-Leyland at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Leyland. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Leyland::Manual::Extending
You can also look for information at:
RT: CPAN's request tracker
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
LICENSE AND COPYRIGHT
Copyright 2010-2014 Ido Perlmuter.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.