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>