Index: trunk/PS-IPP-Config/lib/PS/IPP/Config.pm
===================================================================
--- trunk/PS-IPP-Config/lib/PS/IPP/Config.pm	(revision 16917)
+++ trunk/PS-IPP-Config/lib/PS/IPP/Config.pm	(revision 17487)
@@ -1,5 +1,5 @@
 # Copyright (c) 2006  Paul Price, Joshua Hoblitt
 #
-# $Id: Config.pm,v 1.80 2008-03-11 01:30:37 eugene Exp $
+# $Id: Config.pm,v 1.81 2008-04-28 21:12:12 eugene Exp $
 
 package PS::IPP::Config;
@@ -91,4 +91,5 @@
 	filerules => undef,	# File rules from the camera configuration
 	rejection => undef,	# Rejection data
+	reductionClasses => undef, # Reduction class definitions
 	_userConfig => $mdc,	# The top-level user configuration
 	_siteConfig => undef,	# The site configuration (from _userConfig)
@@ -1004,14 +1005,46 @@
     }
 
-    my $camera = $self->{camera}; # Camera configuration
-    unless (defined $camera) {
-	carp "Camera has not yet been defined.\n";
-	return undef;
-    }
-    
-    my $classes = metadataLookupMD($camera, "REDUCTION") or # Reduction classes
-	(carp "Can't find REDUCTION in camera configuration.\n" and exit($PS_EXIT_CONFIG_ERROR));
-
-    my $class = metadataLookupMD($classes, $reduction) or # Class of interest
+    my $reductionClasses;
+    if (defiend $self->{reductionClasses}) {
+	$reductionClasses = $self->{reductionClasses};
+    } else  {
+	# load and save the reductionClasses table
+
+	# need to have a valid camear
+	my $camera = $self->{camera}; # Camera configuration
+	unless (defined $camera) {
+	    carp "Camera has not yet been defined.\n";
+	    return undef;
+	}
+
+	$reductionClasses = metadataLookup($camera, 'REDUCTION');	# File rules
+
+	unless (defined $reductionClasses) {
+	    carp "Can't find REDUCTION list in camera configuration.\n";
+	    return undef;
+	}
+	
+	if ($reductionClasses->{class} eq "scalar" and $reductionClasses->{type} eq "STR") {
+	    # Allow indirection to a file
+	    my $filename = $self->_find_config($reductionClasses->{value}); # Resolved filename
+	    # Read the file
+	    my $file;		# File handle
+	    unless (open $file, $filename) {
+		carp "Unable to open reductionClasses file $filename: $!";
+		exit($PS_EXIT_CONFIG_ERROR);
+	    }
+	    my @contents = <$file>;
+	    close $file;
+	    $reductionClasses = $parser->parse( join '', @contents);
+	} elsif ($reductionClasses->{class} eq "metadata") {
+	    $reductionClasses = $reductionClasses->{value};
+	} else {
+	    carp "Can't interpret REDUCTIONS in camera configuration.\n";
+	    return undef;
+	}
+	$self->{reductionClasses} = $reductionClasses;
+    }
+
+    my $class = metadataLookupMD($reductionClasses, $reduction) or # Class of interest
 	(carp "Can't find $reduction in REDUCTION in camera configuration.\n" and
 	 exit($PS_EXIT_CONFIG_ERROR));
