1 package SL::DB::Object::Hooks;
7 use parent qw(Exporter);
8 our @EXPORT = qw(before_load after_load
10 before_delete after_delete);
17 _add_hook('before_save', @_);
21 _add_hook('after_save', @_);
25 _add_hook('before_load', @_);
29 _add_hook('after_load', @_);
33 _add_hook('before_delete', @_);
37 _add_hook('after_delete', @_);
43 my ($object, $when, @args) = @_;
45 foreach my $sub (@{ ( $hooks{$when} || { })->{ ref($object) } || [ ] }) {
46 my $result = ref($sub) eq 'CODE' ? $sub->($object, @args) : $object->call_sub($sub, @args);
47 SL::X::DBHookError->throw(when => $when,
48 hook => (ref($sub) eq 'CODE' ? '<anonymous sub>' : $sub),
50 object_type => ref($object))
58 my ($when, $class, $sub_name, $code) = @_;
59 $hooks{$when} ||= { };
60 $hooks{$when}->{$class} ||= [ ];
61 push @{ $hooks{$when}->{$class} }, $sub_name;
73 SL::DB::Object::Hooks - Hooks that are run before/after a
78 Hooks are functions that are called before or after an object is
79 loaded, saved or deleted. The package defines the hooks, and those
80 hooks themselves are run as instance methods.
82 Hooks are run in the order they're added.
84 Hooks must return a trueish value in order to continue processing. If
85 any hook returns a falsish value then an exception (instance of
86 C<SL::X::DBHookError>) is thrown. However, C<SL::DB::Object> usually
87 runs the hooks from within a transaction, catches the exception and
88 only returns falsish in error cases.
94 =item C<before_load $sub>
96 =item C<before_save $sub>
98 =item C<before_delete $sub>
100 =item C<after_load $sub>
102 =item C<after_save $sub>
104 =item C<after_delete $sub>
106 Adds a new hook that is called at the appropriate time. C<$sub> can be
107 either a name of an existing sub or a code reference. If it is a code
108 reference then the then-current C<$self> will be passed as the first
111 C<before> hooks are called without arguments.
113 C<after> hooks are called with a single argument: the result of the
114 C<save> or C<delete> operation.
116 =item C<run_hooks $object, $when, @args>
118 Runs all hooks for the object C<$object> that are defined for
119 C<$when>. C<$when> is the same as one of the C<before_xyz> or
120 C<after_xyz> function names above.
122 An exception of C<SL::X::DBHookError> is thrown if any of the hooks
123 returns a falsish value.
125 This function is supposed to be called by L<SL::DB::Object/"load">,
126 L<SL::DB::Object/"save"> or L<SL::DB::Object/"delete">.
132 This mixin exports the functions L</before_load>, L</after_load>,
133 L</before_save>, L</after_save>, L</before_delete>, L</after_delete>.
141 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>