Kelp::Module - Base class for Kelp modules
package Kelp::Module::MyModule; use parent 'Kelp::Module'; sub build { my ( $self, %args ) = @_; $self->register( greet => sub { print "Hi there." } ); }
Provides the base class for creating Kelp modules. Creating a Kelp module means extending this class and overriding the build method. Kelp modules usually register a new method into the web application.
build
register
Modules use the "register" method to register new methods into the underlying web application. All the registrations are done in the "build" subroutine. All types of values can be registered and then accessed as a read-only attribute from the web app. The simplest thing you can register is a scalar value:
First...
# lib/Kelp/Module/Month.pm package Kelp::Module::Month; use Kelp::Base 'Kelp::Module'; sub build { my ( $self, %args ) = @_; $self->register( month => 'October' ); }
Then ...
# lib/MyApp.pm package MyApp; use parent 'Kelp'; sub build { my $self = shift; $self->load_module("Month"); } sub is_it_october_yet { my $self = shift; if ( $self->month eq 'October' ) { return "It is October"; } return "Not yet."; }
The above example doesn't do anything meaningful, but it's a good way to show how to create and use Kelp modules. Pay attention to the next example, as it will show you how to register an anonymous subroutine:
package Kelp::Module::Date; use Kelp::Base 'Kelp::Module'; use DateTime; sub build { my ( $self, %args ) = @_; $self->register( date => sub { return DateTime->from_epoch( epoch => time ); } ); }
Now, each time you use $self->date in the web application, you will create a new DateTime object for the current time.
$self->date
DateTime
It is more practical to register an already created object. Consider this example, which uses Redis, initializes an instance of it and registers it as a method in the web app:
Redis
package Kelp::Module::Redis; use Kelp::Base 'Kelp::Module'; use Redis; sub build { my ( $self, %args ) = @_; my $redis = Redis->new(%args); $self->register( redis => $redis ); }
The arguments for all modules are taken from the configuration. If you want to pass arguments for your Redis module (example above), you will have to have a structure in your config, similar to this:
Example of conf/myapp.pl:
conf/myapp.pl
{ # Load module Redis on start modules => ['Redis'], modules_init => { Redis => { server => '192.168.0.1:6379', encoding => 'UTF-8', password => 'boo' } } };
The hash specified by Redis will be sent as %args in the build method of the module.
%args
Kelp will automatically prefix all modules with Kelp::Module, so a module name Redis should live in Kelp::Module::Redis. To use fully qualified modules that live outside of the Kelp::Module namespace, prefix the name with a plus sign.
Kelp::Module
Kelp::Module::Redis
{ # Load a module that lives outside of Kelp::Module modules => ["+Fully::Qualified::Name"], modules_init => { "+Fully::Qualified::Name" => {...} } };
build( %args )
Each module must override this one in order to register new methods. The %args hash will be taken from the configuration.
register( %items )
Registers one or many methods into the web application.
$self->register( json => JSON->new, yaml => YAML->new );
To install Kelp, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Kelp
CPAN shell
perl -MCPAN -e shell install Kelp
For more information on module installation, please visit the detailed CPAN module installation guide.