The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#===============================================================================
#
#  DESCRIPTION:  Perl 5 Writer
#
#       AUTHOR:  Aliaksandr P. Zahatski, <zahatski@gmail.com>
#===============================================================================
=head1 NAME

Plosurin::Writer::Perl5 - perl5 writer

=head1 SYNOPSIS

    my $p5  = new Plosurin::To::Perl5(
           'context' => $ctx,
           'writer'  => new Plosurin::Writer::Perl5,
           'package' => $package,
        );

  
=head1 DESCRIPTION

Plosurin::Writer::Perl5 - perl6 writer

=cut

package Plosurin::Writer::Perl5;
use strict;
use warnings;
use v5.10;

sub new {
    my $class = shift;
    my $ini = $#_ == 0 ? shift : {@_};
    $ini->{varstack} = [ { name => 'res', inited => 0 } ];
    $ini->{ident} = 0;
    $ini->{var_map} //={};
    bless( $ini, ref($class) || $class );

}

#ident for generated code
sub inc_ident {
    $_[0]->{ident} += 4;
}

sub ident { $_[0]->{ident} }

sub dec_ident {
    my $self = shift;
    $self->{ident} -= 4 if $self->{ident} > 3;
}

sub say {
    my $self = shift;
    return $self->print( @_, "\n" );
}

sub print {
    my $self = shift;
    $self->{code} .= " " x $self->ident . "@_";
}

sub pushOtputVar {
    my ( $self, $var ) = @_;
    push @{ $self->{varstack} }, { name => $var, value => '' };

}

sub popOtputVar {
    my ( $self, $var ) = @_;
    pop @{ $self->{varstack} };    #, {name=> $var, value=>''};
}

sub initOutputVar {
    my $self = shift;
    return if $self->currentVar->{inited};
    $self->say( 'my $' . $self->currentVar->{name} . ' =  "";' );
    $self->currentVar->{inited}++;
}

sub currentVar {
    my $self = shift;
    $self->{varstack}[-1];
}

sub appendOutputVar {
    my $self = shift;
    my $data = join '', @_;
    my $v    = $self->currentVar;
    my $name = $v->{name};
    unless ( $v->{inited} ) {
        $self->say( 'my $' . $name . ' = ' . $data . ';' );
        $v->{inited}++;
    }
    else {
        $self->say( '$' . $name . ' .= ' . $data . ';' )

    }
}

sub var_map {
    my $self = shift;
    return $self->{var_map};
}

sub set_var_map {
    my ($self, $tmp_var, $new_var) = @_;
    $self->var_map()->{$tmp_var} =$new_var;
}
1;
__END__

=head1 SEE ALSO

Closure Templates Documentation L<http://code.google.com/closure/templates/docs/overview.html>

Perl 6 implementation L<https://github.com/zag/plosurin>


=head1 AUTHOR

Zahatski Aliaksandr, <zag@cpan.org>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2011 by Zahatski Aliaksandr

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

=cut