[Templates] How To Throw Exception on Missing Method

Matisse Enzer menzer@apple.com
Thu, 26 Jul 2007 20:04:49 -0700


On Jul 26, 2007, at 3:31 PM, Bill Ward wrote:

> On 7/25/07, Matisse Enzer <menzer@apple.com> wrote:
>> How do get Template Toolkit to throw an exception if it encounters a
>> call to a non-existent method?
>>
>> In the following example  zoo   is an object, but there is no
>> get_animals()  method - so I want TT to throw an exception at that
>> point.
>>
>>             [% FOREACH animal IN zoo.get_animals %]
>
> Everyone's suggesting ways to work around your problem... but I think
> this is a flaw in Template.  I thought it was the case that if foo is
> an object, then foo.bar is the bar method, or if foo is a hash, and
> foo.bar is the value corresponding to the key bar.  But apparently, if
> foo is an object implemented as a hash that lacks a bar method,
> Template is looking up the value corresponding to the key bar.  The
> problem with that is you are giving users the chance to peek inside
> objects waaaaay too easily.  Objects are supposed to be accessed using
> their API.
>
> Am I correct in assuming that in your example, zoo is an object whose
> implementation is a hash?  What do you get if you do the same thing
> for an object whose implementation is something other than a hash?
>
> For backward compatibility sake, I don't think we can change this
> behavior.  But what if an option could be added that would make the
> Template engine treat objects more strictly?  Seems analagous to the
> 'use strict' pragma in Perl to me.

Bill, I think it would be helpful for TT be more strict.

Here's a further problem I ran into while trying DEBUG_UNDEF (which  
sent a separate email to the list about):

If there IS a  get_animals()    method, but it happens to return an  
empty list, then DEBUG_UNDEF will also treat that as an error in that  
FOREACH loop. That's a problem for me - an empty list is OK, but an  
undefined value is not. I want a way to generate an exception if  
something is undefined, but no error if the value is empty.

So in:

     [% FOREACH thing IN object.someMethod %]
         [% thing %]
     [% END %]

if      $object->someMethod()    returns an empty list, I don't want  
that to be an error. If $object->someMethod() doesn't exist, or  
returns undef, then I want an error.


-M

------------------------------------
Matisse Enzer
menzer@apple.com