[Templates] format plugin can't work with TT list refs
Stas Bekman
stas@stason.org
Mon, 13 Oct 2003 14:46:40 -0700
Andy Wardley wrote:
> Stas Bekman wrote:
>
>> foo = [ 1 2 3 ];
>> USE format_foo = format("%d %d %d");
>> format_foo(foo);
>
>
> [...]
>
>
>>basically coercing the list ref into IV, instead of interpreting it as a
>>list. Did I miss something obvious or is that a bug in that plugin?
>
>
> It's more of a limitation in the design. TT treats all lists as list
> references and doesn't have a nice way to return the contents of the
> list. i.e. you can't do the Perl equivalent of @$listref.
>
> The problem is in the stash. Say you were to write a new list
> vmethod that returned the items in the list:
>
> $context->define_vmethod( list => items => sub { @$_[0] } );
>
> You would expect to use it like so:
>
> format_foo(foo.items) # doesn't work in TT2
>
> However, when the stash calls the vmethod (in fact any method, or sub),
> it automatically folds a list of items into a reference to a list of
> items. foo.items returns a list, but format_foo() gets passed a list
> ref.
>
> I originally did this to support as many existing Perl modules that may
> return items. In hindsight, it was a bad design decision. It is useful
> but causes action-at-a-distance that probably catches more people out than
> it helps. The documentation has long since said that returning a naked
> list of items (i.e. not a reference to a list) is frowned upon and may
> not be supported in future versions.
>
> TT3 is that future version. As well as being able to write vmethods that
> return multiple items, as in the above example, I think I might also support
> '@' as a shortcut sigil.
>
> format_foo(foo.items) # should work in TT3
> format_foo(@foo) # also work in TT3
>
> I'm using '@' in the same way as '$' is used in TT, to indicate interpolation
> of a variable rather than being an indicator of the underlying data type,
> as it is in Perl. In TT is should be possible to put a '@' in front of
> any variable.
>
> @hash # same as hash.items
> @list # same as list.items
> @text # same as text.items
>
> In certain cases, these will be no-ops, as per the current .list .hash and
> .item vmethods that effectively cast one type to another.
tt2++ => andy++
p.s. i suppose that tt3 will be out really soon now ;)
__________________________________________________________________
Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com