1package Dancer::Factory::Hook;
2our $AUTHORITY = 'cpan:SUKRIA';
3# ABSTRACT: Singleton class to create Dancer hooks
4$Dancer::Factory::Hook::VERSION = '1.3513';
5use strict;
6use warnings;
7use Carp;
8
9use base 'Dancer::Object::Singleton';
10use Dancer::Exception qw(:all);
11
12__PACKAGE__->attributes(qw/ hooks registered_hooks/);
13
14sub init {
15    my ( $class, $self ) = @_;
16    $self->hooks( {} );
17    $self->registered_hooks( [] );
18    return $self;
19}
20
21sub install_hooks {
22    my ( $self, @hooks_name ) = @_;
23
24    if ( !scalar @hooks_name ) {
25        raise core_factory_hook => "at least one name is required";
26    }
27
28    foreach my $hook_name (@hooks_name) {
29        if ( $self->hook_is_registered($hook_name) ) {
30            raise core_factory_hook => "$hook_name is already regsitered, please use another name";
31        }
32        $self->_add_hook( $hook_name );
33    }
34}
35
36sub register_hook {
37    my ( $self, $hook ) = @_;
38    $self->_add_registered_hook( $hook->name, $hook->code );
39}
40
41sub _add_registered_hook {
42    my ($class, $hook_name, $compiled_filter) = @_;
43    push @{$class->hooks->{$hook_name}}, $compiled_filter;
44}
45
46sub _add_hook {
47    my ($self, $hook_name ) = @_;
48    push @{$self->registered_hooks}, $hook_name;
49}
50
51sub hook_is_registered {
52    my ( $self, $hook_name ) = @_;
53    return grep { $_ eq $hook_name } @{$self->registered_hooks};
54}
55
56sub execute_hooks {
57    my ($self, $hook_name, @args) = @_;
58
59    raise core_factory_hook => "Can't ask for hooks without a position" unless $hook_name;
60
61    if (!$self->hook_is_registered($hook_name)){
62        raise core_factory_hook => "The hook '$hook_name' doesn't exists";
63    }
64
65   foreach my $h (@{$self->get_hooks_for($hook_name)}) {
66       $h->(@args);
67   }
68}
69
70sub get_hooks_for {
71    my ( $self, $hook_name ) = @_;
72
73    raise core_factory_hook => "Can't ask for hooks without a position" unless $hook_name;
74
75    $self->hooks->{$hook_name} || [];
76}
77
78
791;
80
81__END__
82
83=pod
84
85=encoding UTF-8
86
87=head1 NAME
88
89Dancer::Factory::Hook - Singleton class to create Dancer hooks
90
91=head1 VERSION
92
93version 1.3513
94
95=head1 AUTHOR
96
97Dancer Core Developers
98
99=head1 COPYRIGHT AND LICENSE
100
101This software is copyright (c) 2010 by Alexis Sukrieh.
102
103This is free software; you can redistribute it and/or modify it under
104the same terms as the Perl 5 programming language system itself.
105
106=cut
107