package DTL::Fast::Tag::Cycle;
use strict;
use utf8;
use warnings FATAL => 'all';
use parent 'DTL::Fast::Tag::Simple';
$DTL::Fast::TAG_HANDLERS{cycle} = __PACKAGE__;
#@Override
sub parse_parameters
{
my $self = shift;
$self->{parameter} =~ /^\s*(.+?)\s*(?:as (.+?)\s*(silent)?)?\s*$/;
@{$self}{'source', 'destination', 'silent', 'sources', 'current_sources'} = ($1 // '', $2 // '', $3 // '', [ ],
[ ]);
$self->{sources} = $self->parse_sources($self->{source});
return $self;
}
#@Override
sub render
{
my ( $self, $context, $global_safe) = @_;
my $result = '';
my $source = $self->get_next_source();
my $current_value = $source->render($context, $global_safe);
if (not $self->{silent})
{
$result = $current_value;
}
if ($self->{destination})
{
$context->set( $self->{destination} => $current_value );
}
return $result;
}
sub get_next_source
{
my $self = shift;
if (not scalar @{$self->{current_sources}}) # populate for current cycle
{
push @{$self->{current_sources}}, @{$self->{sources}};
}
return shift @{$self->{current_sources}};
}
1;