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