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 die SL::X::DBHookError->new(when => $when,
48 hook => (ref($sub) eq 'CODE' ? '<anonymous sub>' : $sub),
57 my ($when, $class, $sub_name, $code) = @_;
58 $hooks{$when} ||= { };
59 $hooks{$when}->{$class} ||= [ ];
60 push @{ $hooks{$when}->{$class} }, $sub_name;
72 SL::DB::Object::Hooks - Hooks that are run before/after a
77 Hooks are functions that are called before or after an object is
78 loaded, saved or deleted. The package defines the hooks, and those
79 hooks themselves are run as instance methods.
81 Hooks are run in the order they're added.
83 Hooks must return a trueish value in order to continue processing. If
84 any hook returns a falsish value then an exception (instance of
85 C<SL::X::DBHookError>) is thrown. However, C<SL::DB::Object> usually
86 runs the hooks from within a transaction, catches the exception and
87 only returns falsish in error cases.
93 =item C<before_load $sub>
95 =item C<before_save $sub>
97 =item C<before_delete $sub>
99 =item C<after_load $sub>
101 =item C<after_save $sub>
103 =item C<after_delete $sub>
105 Adds a new hook that is called at the appropriate time. C<$sub> can be
106 either a name of an existing sub or a code reference. If it is a code
107 reference then the then-current C<$self> will be passed as the first
110 C<before> hooks are called without arguments.
112 C<after> hooks are called with a single argument: the result of the
113 C<save> or C<delete> operation.
115 =item C<run_hooks $object, $when, @args>
117 Runs all hooks for the object C<$object> that are defined for
118 C<$when>. C<$when> is the same as one of the C<before_xyz> or
119 C<after_xyz> function names above.
121 An exception of C<SL::X::DBHookError> is thrown if any of the hooks
122 returns a falsish value.
124 This function is supposed to be called by L<SL::DB::Object/"load">,
125 L<SL::DB::Object/"save"> or L<SL::DB::Object/"delete">.
131 This mixin exports the functions L</before_load>, L</after_load>,
132 L</before_save>, L</after_save>, L</before_delete>, L</after_delete>.
140 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>