package WeBWorK::ContentGenerator;

# This is a superclass for Apache::WeBWorK's content generators.
# You are /definitely/ encouraged to read this file, since there are
# "abstract" functions here which show aproximately what form you would
# want over-ridden sub-classes to follow.  go() is a particularly pertinent
# example.

# new(Apache::Request, WeBWorK::CourseEnvironment)
sub new($$$) {
	my $proto = shift;
	my $class = ref($proto) || $proto;
	my $self = {};
	($self->{r}, $self->{courseEnvironment}) = @_;
	bless $self, $class;
	return $self;
}

# This is a quick and dirty function to print out all (or almost all) of the
# fields in a form in a specified format.  As you can see from the print
# statement, it just prints out $begining$name$middle$value$end for every
# field who's name doesn't match $qr_omit, a quoted regex.
# In it's current incarnation, it should be called from subclasses only,
# by saying $self->print_form_data.  Of course, you could construct a
# hashref with ->{r} being an Apache::Request, I suppose.

sub print_form_data {
	my ($self, $begin, $middle, $end, $qr_omit) = @_;
	
	$r=$self->{r};
	my @form_data = $r->param;
	foreach my $name (@form_data) {
		next if ($qr_omit and $name =~ /$qr_omit/);
		my @values = $r->param($name);
		foreach my $value (@values) {
			print $begin, $name, $middle, $value, $end;
		}
	}
}

# Abstract as they get, this go() is meant to be over-ridden by
# absolutely /anything/ that subclasses it.  Most subclasses, however,
# will find it a useful thing to copy and modify, rather than writing from
# scratch.

sub go() {
	my $self = shift;
	$r = shift;
	$r->content_type($ct);
	foreach $key (keys %headers) {
		$r->header_out($key, $headers{$key});
	}
	$r->send_http_header;
	
	return OK if $r->header_only;
	
	print "You shouldn't see this.  This is only a prototype.";
}

1;
