1 package OpenILS::Application::Trigger::ModLoader;
2 use strict; use warnings;
3 use UNIVERSAL::require;
5 sub prefix { return 'OpenILS::Application::Trigger' }
9 $class = ref($class) || $class;
12 return undef unless ($mod);
15 module => ref $mod ? $mod->module() : $mod,
24 return undef unless (ref $self);
27 $self->{loaded} = $l if (defined $l);
28 return $self->{loaded};
33 return undef unless (ref $self);
36 $self->{handler} = $h if $h;
37 return $self->{handler};
42 return undef unless (ref $self);
45 $self->{module} = $m if $m;
46 return $self->{module};
51 return undef unless (ref $self);
53 my $m = shift || $self->module;
54 my $h = shift || $self->handler;
60 my $builtin_m = $self->prefix . "::$m";
61 $loaded = $builtin_m->use;
65 ($h = $m) =~ s/^.+::([^:]+)$/$1/o;
66 $m =~ s/^(.+)::[^:]+$/$1/o;
72 $builtin_m = $self->prefix . "::$m";
75 $m = $builtin_m if ($loaded);
80 # The following is an escape hatch for builtin dummy handlers
82 $loaded = $self->prefix->use;
83 if ($loaded && $self->prefix->can( $self->module ) ) {
99 $self->loaded($loaded);
103 package OpenILS::Application::Trigger::ModRunner;
104 use base 'OpenILS::Application::Trigger::ModLoader';
108 $class = ref($class) || $class;
113 my $self = $class->SUPER::new( $m );
114 return undef unless ($self && $self->loaded);
116 $self->environment( $e );
122 return undef unless (ref $old);
124 my $class = ref($old);
127 my $self = $class->SUPER::new( $m );
128 return undef unless ($self && $self->loaded);
130 $self->environment( $old->environment );
136 return undef unless (ref $self);
139 $self->{environment} = $e if (defined $e);
140 return $self->{environment};
145 return undef unless (ref $self);
148 $self->{final_result} = $r if (defined $r);
149 return $self->{final_result};
154 return undef unless (ref $self && $self->loaded);
156 $self->environment( shift );
158 my $m = $self->module;
159 my $h = $self->handler;
160 my $e = $self->environment;
161 $self->final_result( $m->$h( $e ) );
166 package OpenILS::Application::Trigger::ModRunner::Collector;
167 use base 'OpenILS::Application::Trigger::ModRunner';
168 sub prefix { return 'OpenILS::Application::Trigger::Collector' }
170 package OpenILS::Application::Trigger::ModRunner::Validator;
171 use base 'OpenILS::Application::Trigger::ModRunner';
172 sub prefix { return 'OpenILS::Application::Trigger::Validator' }
174 package OpenILS::Application::Trigger::ModRunner::Reactor;
175 use base 'OpenILS::Application::Trigger::ModRunner';
176 sub prefix { return 'OpenILS::Application::Trigger::Reactor' }
178 package OpenILS::Application::Trigger::ModRunner::Cleanup;
179 use base 'OpenILS::Application::Trigger::ModRunner';
180 sub prefix { return 'OpenILS::Application::Trigger::Cleanup' }
182 package OpenILS::Application::Trigger::ModStackRunner;
183 use base 'OpenILS::Application::Trigger::ModRunner';
187 $class = ref($class) || $class;
190 $m = [$m] unless (ref($m) =~ /ARRAY/o);
198 for my $mod ( @$m ) {
199 my $r = $self->SUPER::new( $m );
200 return undef unless ($r && $r->loaded);
201 push @{$self->{runners}}, $r;
211 return undef unless (ref $old);
213 my $class = ref($old);
216 my $self = $class->new( $m );
217 return undef unless ($self && $self->loaded);
219 $self->environment( $old->environment );
225 return undef unless (ref $self && $self->loaded);
227 $self->environment( shift );
228 my $e = $self->environment;
230 for my $r (@{$self->{runners}}) {
233 $r->final_result( $m->$h( $e ) );