Raisin
view release on metacpan or search on metacpan
lib/Raisin/API.pm view on Meta::CPAN
#!perl
#PODNAME: Raisin::API
#ABSTACT: Provides Raisin DSL.
use strict;
use warnings;
package Raisin::API;
$Raisin::API::VERSION = '0.94';
use parent 'Exporter';
use Carp;
use Hash::Merge qw(merge);
use Raisin;
use Raisin::Entity;
# use Raisin::Util qw(merge);
my @APP_CONF_METHODS = qw(
app
api_default_format api_format api_version
middleware mount plugin
register_decoder register_encoder
);
my @APP_EXEC_METHODS = qw(new run);
my @APP_METHODS = qw(req res param include_missing session present error);
my @HOOKS_METHODS = qw(before before_validation after_validation after);
my @HTTP_METHODS = qw(del get head options patch post put);
my @ROUTES_METHODS =
qw(resource namespace route_param params requires optional group);
my @SWAGGER_MERTHODS = qw(desc entity summary tags produces);
our @EXPORT = (
@APP_CONF_METHODS,
@APP_EXEC_METHODS,
@APP_METHODS,
@HOOKS_METHODS,
@HTTP_METHODS,
@ROUTES_METHODS,
@SWAGGER_MERTHODS,
);
my %SETTINGS = ();
my @NS = ('');
my $app;
sub import {
my $class = shift;
$class->export_to_level(1, $class, @_);
strict->import;
warnings->import;
my $caller = caller;
$app ||= Raisin->new(caller => $caller);
}
sub app { $app }
#
# Execution
#
sub new { app->run }
sub run { app->run }
#
# Compile
#
sub mount { app->mount_package(@_) }
sub middleware { app->add_middleware(@_) }
#
# Hooks
#
sub before { app->add_hook('before', shift) }
sub before_validation { app->add_hook('before_validation', shift) }
sub after_validation { app->add_hook('after_validation', shift) }
sub after { app->add_hook('after', shift) }
#
# Resource
#
sub resource {
my ($name, $code, @args) = @_;
if (scalar(@args) % 2) {
croak "Odd-sized hash supplied to resource(). Is the previous resource missing a semicolon?";
}
my %args = @args;
if ($name) {
$name =~ s{^/}{}msx;
push @NS, $name;
if ($SETTINGS{desc}) {
app->resource_desc($NS[-1], delete $SETTINGS{desc});
}
my %prev_settings = %SETTINGS;
Hash::Merge::set_clone_behavior(undef);
%SETTINGS = %{ merge(\%SETTINGS, \%args) };
# Going deeper
$code->();
pop @NS;
%SETTINGS = ();
%SETTINGS = %prev_settings;
}
(join '/', @NS) || '/';
( run in 1.517 second using v1.01-cache-2.11-cpan-84e82930d8c )