The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Toader::Render::Page::backends::pod;

use warnings;
use strict;
use base 'Error::Helper';
use Pod::Simple::HTML;
use File::Temp;
use File::Spec;

=head1 NAME

Toader::Render::Page::backends::pod - This handles the POD backend stuff for Toader::Page::Entry.

=head1 VERSION

Version 0.0.0

=cut

our $VERSION = '0.0.0';

=head1 SYNOPSIS

    use Toader::Render::Page::backends::pod;
    
    my $renderer=Toader::Render::Page::backends::pod->new({ toader=>$toader, obj=>$pageObj });
    my $rendered;
    if ( $renderer->error ){
        warn( 'Error:'.$renderer->error.': '.$renderer->errorString );
    }else{
        $rendered=$renderer->render($torender);
    }

=head1 METHODS

=head2 new

This initiates the object.

=head3 args hash ref

=head4 obj

This is the L<Toader::Page> object to render.

=head4 toader

This is the L<Toader> object to use.

	my $foo=Toader::Render::Page::backends::pod->new(\%args);
    if($foo->error){
        warn('error: '.$foo->error.":".$foo->errorString);
    }

=cut

sub new{
	my %args;
	if(defined($_[1])){
		%args= %{$_[1]};
	};

	my $self={
			  error=>undef,
			  errorString=>'',
			  perror=>undef,
			  };
	bless $self;

	#make sure we have a Toader::Page object.
	if ( ! defined( $args{obj} ) ){
		$self->{perror}=1;
		$self->{error}=1;
		$self->{errorString}='Nothing defined for the Toader::Page object';
		$self->warn;
		return $self;
	}
	if ( ref( $args{obj} ) ne 'Toader::Page' ){
        $self->{perror}=1;
        $self->{error}=1;
        $self->{errorString}='The specified object is not a Toader::Page object, but a "'.
			ref( $args{obj} ).'"';
 		$self->warn;
		return $self;
	}
	$self->{obj}=$args{obj};

	#make sure the object does not have a permanent error set
	if( ! $self->{obj}->errorblank ){
		$self->{perror}=1;
		$self->{error}=3;
		$self->{errorString}='The Toader::Page object has a permanent error set';
		$self->warn;
		return $self;
	}

	#make sure a Toader object is given
    if ( ! defined( $args{toader} ) ){
        $self->{perror}=1;
        $self->{error}=2;
        $self->{errorString}='Nothing defined for the Toader object';
        $self->warn;
        return $self;
    }
    if ( ref( $args{toader} ) ne 'Toader' ){
        $self->{perror}=1;
        $self->{error}=2;
        $self->{errorString}='The specified object is not a Toader object, but a "'.
            ref( $args{toader} ).'"';
        $self->warn;
        return $self;
    }
	$self->{toader}=$args{toader};

    #make sure the Toader object does not have a permanent error set
    if( ! $self->{toader}->errorblank ){
        $self->{perror}=1;
        $self->{error}=4;
        $self->{errorString}='The Toader object has an permanent error set';
        $self->warn;
        return $self;
    }

    #make sure a directory is set
    if( ! defined( $self->{obj}->dirGet ) ){
        $self->{perror}=1;
        $self->{error}=5;
        $self->{errorString}='The Toader::Page object does not have a directory set';
        $self->warn;
        return $self;
    }

	return $self;
}

=head2 render

This renders the object.

One argument is taken and that is what is to be rendered.

=cut

sub render{
	my $self=$_[0];
	my $torender=$_[1];

	if ( ! $self->errorblank ){
		return undef;
	}

	if ( !defined( $torender ) ){
		$self->{error}=6;
		$self->{errorString}='Nothing to render specified';
		$self->warn;
		return undef;
	}

	#create a tmp file
	my $tmpfile = File::Temp::tempnam( File::Spec->tmpdir, 'tdat' );
	my $fh;
	if ( ! open( $fh, '>', $tmpfile ) ){
		$self->{error}=7;
		$self->{errorString}='Failed to open a temp file, "'.$tmpfile.'",';
		$self->warn;
		return undef;
	}
	print $fh $torender;
	close( $fh );

	#print `ls $tmpfile; cat $tmpfile`;

	#renders it
	my $p = Pod::Simple::HTML->new;
	my $html;
	$p->index(1);
	$p->output_string(\$html);
	$p->parse_file( $tmpfile );

	#unlinks the file
	if (! unlink( $tmpfile ) ){
		$self->{error}=8;
		$self->{errorString}='Failed to unlink "'.$tmpfile.'"';
		$self->warn;
		return undef;		
	}

	#makes sure something is returned for html
	if (! defined( $html ) ){
		$self->{error}=9;
		$self->{errorString}='Failed to render the html';
		$self->warn;
		return undef;		
	}

	return $html;
}

=head1 ERROR CODES

=head2 1

No L<Toader::Page> object specified.

=head2 2

No L<Toader> object specified.

=head2 3

The L<Toader::Page> object has a permanent error set.

=head2 4

The L<Toader> object has a permanent error set.

=head2 5

The L<Toader::Page> object does not have a directory set.

=head2 6

Nothing specified to render.

=head2 7

Failed to open a temp file.

=head2 8

Failed to unlink the the temporary file.

=head2 9

Failed to render the HTML.

=head1 AUTHOR

Zane C. Bowers-Hadley, C<< <vvelox at vvelox.net> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-toader at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Toader>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Toader::Render::Page::backends::pod


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Toader>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Toader>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Toader>

=item * Search CPAN

L<http://search.cpan.org/dist/Toader/>

=back


=head1 ACKNOWLEDGEMENTS


=head1 LICENSE AND COPYRIGHT

Copyright 2012. Zane C. Bowers-Hadley.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.


=cut

1; # End of Toader::Render::Page::backends::pod