/usr/share/perl5/Dancer/Hook.pm is in libdancer-perl 1.3091+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | package Dancer::Hook;
use strict;
use warnings;
use Carp;
use base 'Dancer::Object';
__PACKAGE__->attributes(qw/name code properties/);
use Dancer::Factory::Hook;
use Dancer::Hook::Properties;
use Dancer::Exception qw(:all);
sub new {
my ($class, @args) = @_;
my $self = bless {}, $class;
if (!scalar @args) {
raise core_hook => "one name and a coderef are required";
}
my $hook_name = shift @args;
# XXX at the moment, we have a filer position named "before_template".
# this one is renamed "before_template_render", so we need to alias it.
# maybe we need to deprecate 'before_template' to enforce the use
# of 'hook before_template_render => sub {}' ?
$hook_name = 'before_template_render' if $hook_name eq 'before_template';
$self->name($hook_name);
my ( $properties, $code );
if ( scalar @args == 1 ) {
$properties = Dancer::Hook::Properties->new();
$code = shift @args;
}
elsif ( scalar @args == 2 ) {
my $prop = shift @args;
$properties = Dancer::Hook::Properties->new(%$prop);
$code = shift @args;
}
else {
raise core_hook => "something's wrong with parameters passed to Hook constructor";
}
ref $code eq 'CODE'
or raise core_hook => "the code argument passed to hook construction was not a CodeRef. Value was : '$code'";
my $compiled_filter = sub {
my @arguments = @_;
return if Dancer::SharedData->response->halted;
my $app = Dancer::App->current();
return unless $properties->should_run_this_app($app->name);
Dancer::Logger::core( "entering " . $hook_name . " hook" );
try { $code->(@arguments) }
catch {
my ($exception) = @_;
# exception is not a workflow continuation but a genuine error
my $err = Dancer::Error->new(
code => 500,
title => $hook_name . ' filter error',
message => "An error occured while executing the filter named $hook_name: $exception",
exception => $exception,
);
# raise a new halt exception
Dancer::halt( $err->render );
};
};
$self->properties($properties);
$self->code($compiled_filter);
Dancer::Factory::Hook->instance->register_hook($self);
return $self;
}
1;
=head1 NAME
Dancer::Hook - Class to manipulate hooks with Dancer
=head1 DESCRIPTION
Manipulate hooks with Dancer
=head1 SYNOPSIS
# inside a plugin
use Dancer::Hook;
Dancer::Hook->register_hooks_name(qw/before_auth after_auth/);
=head1 METHODS
=head2 register_hook ($hook_name, [$properties], $code)
hook 'before', {apps => ['main']}, sub {...};
hook 'before' => sub {...};
Attaches a hook at some point, with a possible list of properties.
Currently supported properties:
=over 4
=item apps
an array reference containing apps name
=back
=head2 register_hooks_name
Add a new hook name, so application developers can insert some code at this point.
package My::Dancer::Plugin;
Dancer::Hook->instance->register_hooks_name(qw/before_auth after_auth/);
=head2 hook_is_registered
Test if a hook with this name has already been registered.
=head2 execute_hooks
Execute a list of hooks for some position
=head2 get_hooks_for
Returns the list of coderef registered for a given position
=head1 AUTHORS
This module has been written by Alexis Sukrieh and others.
=head1 LICENSE
This module is free software and is published under the same
terms as Perl itself.
|