package MyStash;
use strict;

use Template::Stash();
use HTML::Entities();
use vars qw(@ISA);
@ISA = qw(Template::Stash);

sub get {
	my ($self, $ident, $args) = @_;
	my ($result) = $self->SUPER::get($ident, $args);
	$result = HTML::Entities::encode($result);	
	return ($result);
}

sub _assign {
    my ($self, $root, $item, $args, $value, $default) = @_;
    my $rootref = ref $root;
    my $result;
    $args ||= [ ];
    $default ||= 0;

#    print(STDERR "_assign(root=$root, item=$item, args=[@$args], \n",
#                         "value=$value, default=$default)\n")
#       if $DEBUG;

    # return undef without an error if either side of the dot is unviable
    # or if an attempt is made to update a private member, starting _ or .
    return undef                                                ## RETURN
        unless $root and defined $item and $item !~ /^[\._]/;

    if ($rootref eq 'HASH' || UNIVERSAL::isa($root, __PACKAGE__)) {
#       if ($item eq 'IMPORT' && UNIVERSAL::isa($value, 'HASH')) {
#           # import hash entries into root hash
#           @$root{ keys %$value } = values %$value;
#           return '';                                          ## RETURN
#       }
        # if the root is a hash we set the named key
        return ($root->{ $item } = $value)                      ## RETURN
            unless $default && $root->{ $item };
    }
    elsif ($rootref eq 'ARRAY' && $item =~ /^-?\d+$/) {
        # or set a list item by index number
        return ($root->[$item] = $value)                        ## RETURN
            unless $default && $root->{ $item };
    }
    elsif (UNIVERSAL::isa($root, 'UNIVERSAL')) {
        # try to call the item as a method of an object

        return $root->$item(@$args, $value)                     ## RETURN
            unless $default && $root->$item();

# 2 issues:
#   - method call should be wrapped in eval { }
#   - fallback on hash methods if object method not found
#
#         eval { $result = $root->$item(@$args, $value); };
#
#         if ($@) {
#             die $@ if ref($@) || ($@ !~ /Can't locate object method/);
#
#             # failed to call object method, so try some fallbacks
#             if (UNIVERSAL::isa($root, 'HASH') && exists $root->{ $item }) {
#                 $result = ($root->{ $item } = $value)
#                     unless $default && $root->{ $item };
#             }
#         }
#         return $result;                                               ## RETURN

    }
    else {
        die "don't know how to assign to [$root].[$item]\n";    ## DIE
    }

    return undef;
}

1;
