Dancer-Plugin-Resource
view release on metacpan or search on metacpan
lib/Dancer/Plugin/Resource.pm view on Meta::CPAN
if ( my $p = $options{params} ) {
$p = ref $p ? $p : [$p];
$params = join '/', map ":${_}", @{$p};
}
else {
$params = ":${singular_resource}_id";
}
my ($package) = caller;
# main resource endpoints
# CRUD
_post(
_endpoint(
path => $plural_resource,
params => '',
verbs => [qw/POST create/],
function => $singular_resource
)
);
_get(
_endpoint(
path => $plural_resource,
params => $params,
verbs => [qw/GET get read/],
loader => $options{load},
function => $singular_resource
)
);
_put(
_endpoint(
path => $plural_resource,
params => $params,
verbs => [qw/PUT update/],
loader => $options{load},
function => $singular_resource
)
);
_del(
_endpoint(
path => $plural_resource,
params => $params,
verbs => [qw/DELETE delete/],
loader => $options{load},
function => $singular_resource
)
);
_get(
_endpoint(
path => $plural_resource,
params => '',
verbs => [qw/INDEX index/],
loader => $options{load_all},
function => $singular_resource
)
);
# member routes are actions on the given id. ie /users/:user_id/foo
for my $member (@{$options{member}}) {
my $path = "${plural_resource}/$params/${member}";
my $member_param = "";
_post(
_endpoint(
path => $path,
params => '',
verbs => [qw/POST create/],
loader => $options{load},
function => "${singular_resource}_${member}"
)
);
_get(
_endpoint(
path => $path,
params => $member_param,
verbs => [qw/GET get read/],
loader => $options{load},
function => "${singular_resource}_${member}"
)
);
_put(
_endpoint(
path => $path,
params => $member_param,
verbs => [qw/PUT update/],
loader => $options{load},
function => "${singular_resource}_${member}"
)
);
_del(
_endpoint(
path => $path,
params => $member_param,
verbs => [qw/DELETE delete/],
loader => $options{load},
function => "${singular_resource}_${member}"
)
);
}
# collection routes are actions on the collection. ie /users/foo
for my $collection (@{$options{collection}}) {
my $path = "${plural_resource}/${collection}";
_post(
_endpoint(
path => $path,
params => '',
verbs => [qw/POST create/],
loader => $options{load_all},
function => "${plural_resource}_${collection}"
)
);
_get(
_endpoint(
path => $path,
params => '',
verbs => [qw/GET get read/],
loader => $options{load_all},
function => "${plural_resource}_${collection}"
)
);
_put(
_endpoint(
path => $path,
params => '',
verbs => [qw/PUT update/],
loader => $options{load_all},
function => "${plural_resource}_${collection}"
)
);
_del(
_endpoint(
path => $path,
params => '',
verbs => [qw/DELETE delete/],
loader => $options{load_all},
function => "${plural_resource}_${collection}"
)
);
}
# save every defined resource if it is referred as a parent in a nested child resource
lib/Dancer/Plugin/Resource.pm view on Meta::CPAN
}
sub _del {
my ($route, $sub) = @_;
for ($route . '.:format', $route) {
_debug("=> DEL " .(Dancer::App->current->prefix||'').$_."\n");
del($_ => $sub);
}
}
sub _endpoint {
my %opts = @_;
my ($function, $word, $params, $verbs, $load_func) = @opts{qw/function path params verbs loader/};
my $package = caller(1);
my $wrapped;
for my $verb (@$verbs) {
# allow both foo_GET and GET_foo
my $func = _function_exists("${package}::${verb}_${function}") ||
_function_exists("${package}::${function}_${verb}");
( run in 0.337 second using v1.01-cache-2.11-cpan-b61123c0432 )