On Mon, Apr 15, 2002 at 07:24:13PM -0700, Larry Wall wrote:
> So the main reason that objects can function as hashes is so that the
> user can poke an object into an interface expecting a hash and have it
> "make sense", to the extent that the object is willing to be viewed like
> that.  

AKA the uniform access principle.  

This was something that I was very keen to exploit in the Template Toolkit
where foo.bar is interpreted as "Do(t) The Right Thing" to access the 
'bar' part of 'foo', be it the 'bar' key in the 'foo' hash or the 'bar'
method of the 'foo' object.  The result is, of course, that you can use
a hash of static data one day (great for mocking up web pages for example) 
and later upgrade it to an object which fetches/generates data on demand 
(e.g. from a database) when you put your pages into production.

Alas, I also designed a flaw into the system by introducing "virtual 
methods" that TT automatically applies onto various data types, equivalent
to various Perl functions, e.g. somehash.keys or somelist.size.  As 
convenient as this is, the problem lies in the fact that you can't 
differentiate somehash.keys between the Perl equivalents of C<keys %$hash>
or C<$hash->{keys}>.

So my thought for version 3 of TT is to introduce somehash.{keys} as 
a syntax to mean "only the 'keys' key/method of the 'foo' hash/object 
but *NOT* the 'keys' virtual method" and to leave somehash.keys resolving 
to the virtual method as it currently does.

Am I right in thinking that this would then be (roughly) consistent with 
the Perl 6 syntax?  

e.g.

  TT3          Perl 6          Perl 5 (hash)  Perl 5 (obj)
  --------------------------------------------------------
  foo.keys     $foo.keys       keys %$foo     $foo->keys()
  foo.{keys}   $foo.{keys}     $foo->{keys}   $foo->keys()
  
Hang on, now I'm a little confused - I thought that hashes were supposed
to keep their % sigil.  So shouldn't that be %foo.keys or %foo.{keys}?
But then that would then violate the uniform access principle because
hash/key access has a different syntax from object/method?

Have I missed a vital clue?


A


Reply via email to