The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Template::Stash::ForceUTF8;

use strict;
our $VERSION = '0.03';

use Template::Config;
use base ( $Template::Config::STASH );
use Encode;

sub get {
    my $self = shift;
    my $result = $self->SUPER::get(@_);
    return $result if ref $result;

    Encode::_utf8_on($result) unless Encode::is_utf8($result);
    return $result;
}

1;
__END__

=head1 NAME

Template::Stash::ForceUTF8 - Force UTF-8 (Unicode) flag on stash variables

=head1 SYNOPSIS

  use Template::Stash::ForceUTF8;
  use Template;

  my $tt = Template->new(
      LOAD_TEMPLATES => [ Template::Provider::Encoding->new ],
      STASH => Template::Stash::ForceUTF8->new,
  );

  my $vars;
  $vars->{foo} = "\x{5bae}\x{5ddd}";         # Unicode flagged
  $vars->{bar} = "\xe5\xae\xae\xe5\xb7\x9d"; # UTF-8 bytes

  $tt->process($template, $vars); # this DWIMs

=head1 DESCRIPTION

Template::Stash::ForceUTF8 is a Template::Stash that forces Unicode
flag on stash variables. Best used with L<Template::Provider::Encoding>.

=head1 SEE ALSO

L<Template::Provider::Encoding>

=cut