The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Padre::PPI::EndifyPod;

=pod

=head1 NAME

Padre::PPI::EndifyPod - Move fragmented POD to the end of a Perl document

=head1 SYNOPSIS

  my $transform = Padre::PPI::EndifyPod->new;
  $transform->apply( Padre::Current->document );

=cut

use 5.008;
use strict;
use warnings;
use Padre::PPI::Transform ();

our $VERSION = '1.00';
our @ISA     = 'Padre::PPI::Transform';





######################################################################
# Transform Methods

sub document {
	my $self     = shift;
	my $document = shift;

	# Find all the POD fragments
	my $pod = $document->find('PPI::Token::Pod');
	unless ( defined $pod ) {
		Padre::Current->main->error( Wx::gettext('Error while searching for POD') );
		return undef;
	}
	unless ($pod) {
		Padre::Current->main->error( Wx::gettext('This document does not contain any POD') );
		return 0;
	}
	unless ( @$pod > 1 ) {
		Padre::Current->main->error( Wx::gettext('Only one POD fragment, will not try to merge') );
		return 0;
	}

	# Create a single merged POD fragment
	my $merged = PPI::Token::Pod->merge(@$pod);
	unless ($merged) {
		Padre::Current->main->error( Wx::gettext('Failed to merge the POD fragments') );
		return undef;
	}

	# Strip all the fragments out of the document
	foreach my $element (@$pod) {
		next if $element->delete;
		$document->current->error( Wx::gettext('Failed to delete POD fragment') );
		return undef;
	}

	# Does the document already have an __END__ block?
	my $end = $document->child(-1);
	if ( $end and $end->isa('PPI::Statement::End') ) {

		# Make sure there's sufficient newlines at the end
		$end->last_element->content =~ /(\n*)\z/;
		my $newlines = length $1;
		my $needed   = 2 - $newlines;
		if ( $needed > 0 ) {
			$end->last_element->{content} .= join '', ("\n") x $needed;
		}

		# Append the merged Pod
		$end->add_element($merged);

	} else {

		# Generate the end block
		my $statement = PPI::Statement::End->new;
		$statement->add_element( PPI::Token::Separator->new("__END__") );
		$statement->add_element( PPI::Token::Whitespace->new("\n") );
		$statement->add_element( PPI::Token::End->new("\n") );
		$statement->add_element($merged);

		# Add it to the document
		$document->add_element( PPI::Token::Whitespace->new("\n") );
		$document->add_element($statement);
	}

	return 1;
}

1;

=pod

=head1 SEE ALSO

L<Padre::PPI::Transform>, L<PPI::Transform>

=head1 AUTHOR

Adam Kennedy E<lt>adamk@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2008-2013 The Padre development team as listed in Padre.pm.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl 5 itself.

=cut

# Copyright 2008-2013 The Padre development team as listed in Padre.pm.
# LICENSE
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl 5 itself.