package Template::Directive::PHP;

use strict;
use Template::Directive;
use base 'Template::Directive';

our $OUTPUT = '$output .= ';


sub php_tag {
    my $php = shift;
    return "$OUTPUT '<? $php ?>';";
}

sub php_block {
    my ($php, $block) = @_;
    return php_tag($php) . "\n" . $block . "\n";
}


#------------------------------------------------------------------------
# ident(\@ident)
#------------------------------------------------------------------------

sub ident {
    my ($class, $ident) = @_;
    return "''" unless @$ident;
    my @names;

    while (@$ident) {
        my $name = shift @$ident;
        my $args = shift @$ident;

        # remove single quotes added by parser 
        for ($name) {
            s/^'//;
            s/'$//;
        }
        push(@names, $name);
    }
	return '$' . join('.', @names);

}
 
#------------------------------------------------------------------------
# get($expr)
#------------------------------------------------------------------------

sub get {
    my ($class, $expr) = @_;  
    return php_tag($expr);
}

#------------------------------------------------------------------------
# if($expr, $block, $else)
#------------------------------------------------------------------------

sub if {
    my ($class, $expr, $block, $else) = @_;
    my @else = $else ? @$else : ();
    $else = pop @else;

    my $output = php_block("if ($expr) {", $block);

    foreach my $elsif (@else) {
        ($expr, $block) = @$elsif;
        $output .= php_block("} elsif ($expr) {", $block);
    }
    if (defined $else) {
        $output .= php_block("} else {", $else);
    }

    $output .= php_tag('}');

    return $output;
}

#------------------------------------------------------------------------
# foreach($target, $list, $args, $block)
#------------------------------------------------------------------------

sub foreach {
    my ($class, $target, $list, $args, $block) = @_;
    my $output = php_block("foreach ($list as \$$target) {", $block);
    $output .= php_tag('}');
    return $output;
}

1;

__END__

