On 2016-02-24 14:17, Tom Molesworth wrote:
Hi Dave,

On 24/02/16 14:07, Dave Howorth wrote:
On 2016-02-24 13:01, Tom Molesworth wrote:
On 24/02/16 12:44, Dave Howorth wrote:
I'm trying to define a custom vmethod but not succeeding.

I tried using the way described in the manual and also by calling
define_vmethod. Both ways appear to have set up methods in the
Template::Stash::SCALAR_OPS hashref but neither of them appears to
work, even with a very simple body. Any clues to what I'm doing wrong
gratefully received!

In the perl:

use Template::Stash;
$Template::Stash::SCALAR_OPS->{uniprot_is_obsolete} =
    sub {
        return 42;
    };

sub forty_two { return 42; }
Template::Stash->define_vmethod('scalar', 'forty_two', &forty_two);

warn join ' ', keys %$Template::Stash::SCALAR_OPS, "\n";

Those look fine - are you sure that [% representative %] is defined as a
scalar rather than a hashref/arrayref/object?

representative is an object. An object is a scalar. If I replace the
definition of x in your test by x => sub {123} the test still passes.

More to the point, representative.defined returns 1 and has the same
code (apart from the value of the numerical constant) as forty_two,
which doesn't return 42!

So it's a blessed hashref? If so, I'd expect that to be attempting to
look up the key rather than calling scalar ops. Put those custom
definitions in the 'hash' rather than 'scalar' ops definition and things
should start working, although that's going to affect any hash lookups
that use obj.key rather than obj.item(key).

Hi Tom,

It's TT2's strange worldview again. But thanks for the hint. I used a dummy scalar and passed the object as an extra argument. It looks clunky but at least it's obvious what's going on.

Thanks again for the help,
Dave

See updated test attached.

cheers,

Tom


_______________________________________________
templates mailing list
[email protected]
http://mail.template-toolkit.org/mailman/listinfo/templates

Reply via email to