From 43d55505cc565f63d9fae73a6bbf459d47eb25e1 Mon Sep 17 00:00:00 2001 From: miker Date: Fri, 23 Jan 2009 21:06:27 +0000 Subject: [PATCH] initial cut of some scaffolding which will load and run Collector, Validator, Reactor and Cleanup handlers git-svn-id: svn://svn.open-ils.org/ILS/trunk@11939 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../OpenILS/Application/Trigger/ModRunner.pm | 212 +++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 Open-ILS/src/perlmods/OpenILS/Application/Trigger/ModRunner.pm diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/ModRunner.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/ModRunner.pm new file mode 100644 index 0000000000..47621ae9ca --- /dev/null +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/ModRunner.pm @@ -0,0 +1,212 @@ +package OpenILS::Application::Trigger::ModLoader; +use UNIVERSAL::require; + +sub new { + my $class = shift; + $class = ref($class) || $class; + + my $mod_thing = shift; + return undef unless ($mod_thing); + + my $self = bless { + mod_thing => $mod_thing, + module => $mod_thing->module(), + handler => 'handler' + } => $class; + + return $self->load; +} + +sub loaded { + my $self = shift; + return undef unless (ref $self); + + my $l = shift; + $self->{loaded} = $l if (defined $l); + return $self->{loaded}; +} + +sub handler { + my $self = shift; + return undef unless (ref $self); + + my $h = shift; + $self->{handler} = $h if $h; + return $self->{handler}; +} + +sub module { + my $self = shift; + return undef unless (ref $self); + + my $m = shift; + $self->{module} = $m if $m; + return $self->{module}; +} + +sub load { + my $self = shift; + return undef unless (ref $self); + + my $m = shift || $self->module; + my $h = shift || $self->handler; + return 1 unless $m; + + my $loaded = $m->use; + + if (!$loaded) { + $builtin_m = "OpenILS::Application::Trigger::$m"; + $loaded = $builtin_m->use; + + if (!$loaded) { + if ($m =~ /::/o) { + ($h = $m) =~ s/^.+::([^:]+)$/$1/o; + $m =~ s/^(.+)::[^:]+$/$1/o; + + $loaded = $m->use; + + if (!$loaded) { + $h = $self->handler; + my $builtin_m = "OpenILS::Application::Trigger::$m"; + $loaded = $m->use; + + $m = $builtin_m if ($loaded); + } + } else { + $loaded = $m->use; + } + } else { + $m = $builtin_m; + } + } + + if ($loaded) { + $self->module( $m ); + $self->handler( $h ); + } + + $self->loaded($loaded); + return $self; +} + +package OpenILS::Application::Trigger::ModRunner; +use base 'OpenILS::Application::Trigger::ModLoader'; + +sub new { + my $class = shift; + $class = ref($class) || $class; + + my $m = shift; + my $e = shift || {}; + + my $self = $class->SUPER::new( $m ); + return undef unless ($self && $self->loaded); + + $self->environment( $e ); + return $self; +} + +sub pass { + my $old = shift; + return undef unless (ref $old); + + my $class = ref($old); + my $m = shift; + + my $self = $class->SUPER::new( $m ); + return undef unless ($self && $self->loaded); + + $self->environment( $old->environment ); + return $self; +} + +sub environment { + my $self = shift; + return undef unless (ref $self); + + my $e = shift; + $self->{environment} = $e if (defined $e); + return $self->{environment}; +} + +sub final_result { + my $self = shift; + return undef unless (ref $self); + + my $r = shift; + $self->{final_result} = $r if (defined $r); + return $self->{final_result}; +} + +sub run { + my $self = shift; + return undef unless (ref $self && $self->loaded); + + $self->environment( shift ); + + my $m = $self->module; + my $h = $self->handler; + my $e = $self->environment; + $self->final_result( $m->$h( $e ) ); + + return $self; +}; + +package OpenILS::Application::Trigger::ModStackRunner; +use base 'OpenILS::Application::Trigger::ModRunner'; + +sub new { + my $class = shift; + $class = ref($class) || $class; + + my $m = shift; + $m = [$m] unless (ref($m) =~ /ARRAY/o); + + my $e = shift || {}; + + my $self = bless { + runners => [] + } => $class; + + for my $mod ( @$m ) { + my $r = $self->SUPER::new( $m ); + return undef unless ($r && $r->loaded); + push @{$self->{runners}}, $r; + } + + $self->loaded(1); + + return $self; +} + +sub pass { + my $old = shift; + return undef unless (ref $old); + + my $class = ref($old); + my $m = shift; + + my $self = $class->new( $m ); + return undef unless ($self && $self->loaded); + + $self->environment( $old->environment ); + return $self; +} + +sub run { + my $self = shift; + return undef unless (ref $self && $self->loaded); + + $self->environment( shift ); + my $e = $self->environment; + + for my $r (@{$self->{runners}}) { + my $m = $r->module; + my $h = $r->handler; + $r->final_result( $m->$h( $e ) ); + } + + return $self; +}; + +1; -- 2.11.0