The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package HTTP::OAI::GetRecord;

use strict;
use warnings;

use HTTP::OAI::SAXHandler qw/ :SAX /;

use vars qw(@ISA);

@ISA = qw( HTTP::OAI::Response );

sub new {
	my ($class,%args) = @_;

	$args{handlers} ||= {};
	$args{handlers}->{header} ||= "HTTP::OAI::Header";
	$args{handlers}->{metadata} ||= "HTTP::OAI::Metadata";
	$args{handlers}->{about} ||= "HTTP::OAI::Metadata";

	my $self = $class->SUPER::new(%args);

	$self->verb('GetRecord') unless $self->verb;
	
	$self->{record} ||= [];
	$self->record($args{record}) if defined($args{record});

	return $self;
}

sub record {
	my $self = shift;
	$self->{record} = [shift] if @_;
	return wantarray ?
		@{$self->{record}} :
		$self->{record}->[0];
}
sub next { shift @{shift->{record}} }

sub generate_body {
	my ($self) = @_;

	for( $self->record ) {
		$_->set_handler($self->get_handler);
		$_->generate;
	}
}

sub start_element {
	my ($self,$hash) = @_;
	my $elem = $hash->{LocalName};
	if( $elem eq 'record' && !exists($self->{"in_record"}) ) {
		$self->{OLDHandler} = $self->get_handler;
		my $rec = HTTP::OAI::Record->new(
			version=>$self->version,
			handlers=>$self->{handlers},
		);
		$self->record($rec);
		$self->set_handler($rec);
		$self->{"in_record"} = $hash->{Depth};
	}
	$self->SUPER::start_element($hash);
}

sub end_element {
	my ($self,$hash) = @_;
	$self->SUPER::end_element($hash);
	my $elem = lc($hash->{LocalName});
	if( $elem eq 'record' &&
		exists($self->{"in_record"}) &&
		$self->{"in_record"} == $hash->{Depth} ) {
		$self->set_handler($self->{OLDHandler});
	}
}

1;

__END__

=head1 NAME

HTTP::OAI::GetRecord - An OAI GetRecord response

=head1 DESCRIPTION

HTTP::OAI::GetRecord is derived from L<HTTP::OAI::Response|HTTP::OAI::Response> and provides access to the data contained in an OAI GetRecord response in addition to the header information provided by OAI::Response.

=head1 SYNOPSIS

	use HTTP::OAI::GetRecord();

	$res = new HTTP::OAI::GetRecord();
	$res->record($rec);

=head1 METHODS

=over 4

=item $gr = new HTTP::OAI::GetRecord

This constructor method returns a new HTTP::OAI::GetRecord object.

=item $rec = $gr->next

Returns the next record stored in the response, or undef if no more record are available. The record is returned as an L<OAI::Record|OAI::Record>.

=item @recs = $gr->record([$rec])

Returns the record list, and optionally adds a record to the end of the queue. GetRecord will only store one record at a time, so this method will replace any existing record if called with argument(s).

=item $dom = $gr->toDOM()

Returns an XML::DOM object representing the GetRecord response.

=back