Re: extending <% | %>

Jonathan Swartz <[email protected]> Wed, 16 Jan 2008 12:38:49 -0800
Newsgroups gmane.comp.web.mason.devel
Message-ID <[email protected]>
Wow, thanks Hans! We've talked for a while about reconciling |,  
filters, and components-with-content. Looking forward to taking a  
look at your patch.

Jon

On Jan 16, 2008, at 8:12 AM, Hans Dieter Pearcey wrote:

> Attached is a patch that makes | in substitutions more powerful.   
> This isn't
> finished; it does work, and all but two of the existing tests pass  
> with it, but
> the implementation feels a bit fragile and there's no documentation.
>
> There are two major changes.
>
> The first is that there can be multiple |s in a substitution, and  
> each can have
> arguments (which can be arbitrary Perl).  I called these 'filters',  
> even though
> that's kind of an overloaded word now (so I'm open to suggestions).
>
> The second is that instead of evaluating the LHS of a substitution  
> immediately,
> it's wrapped in sub { } and passed to the filters that way; this  
> gives more
> control to the filters, because evaluation is delayed.
>
> Some examples will probably be clearer:
>
>   <% $object->expensive_method(\%args) | cache(expires_in => "10m")  
> | h %>
>
> (there's a test that demonstrates that in t/10-cache.t)
>
>   <% $biller->calculate_amount | format('$%5.2f') %>
>
> The old escape_flags and apply_escapes are now implemented in terms  
> of filters.
> They keep working anywhere in the filter pipeline; the only special  
> casing done
> for them is that escape flags are parsed specially when they're the  
> last filter
> entry, so that this keeps working:
>
>   <% $foo | h, u %>
>
> But this would also work:
>
>   <% $foo | h | u | cache %>
>
> I also did some refactoring of cache_self -- '| cache(...)' uses  
> the same
> arguments as cache_self, and I didn't want to reinvent the wheel.  See
> HTML::Mason::Request::_cache_access (the name sucks).  We probably  
> want
> something like this independent of the rest of the patch; it makes  
> writing
> cache_self analogues much easier.
>
> Because LHS evaluation is delayed, I had to do some ugly things to  
> make sure
> that globals referred to on the LHS were still around at $m->print  
> time,
> especially $_ and @_.
>
> One thing I can't fix is that wantarray becomes useless in <% %>  
> (it will
> always be true).  It used to reflect the calling context of exec().
>
> Look at HTML::Mason::Filters for how cache() and format() are  
> written.  In
> particular, the latter is written pretty much exactly how an  
> 'escape' used to
> be.
>
> Things I have not yet done, but consider necessary or very useful  
> for this
> being 'finished':
>
>  * cache() should autogenerate a unique cache key per <% %> (and  
> maybe even
>    per-filter, per-substitution), so that it's trivial to stick '|  
> cache' onto
>    existing substitutions
>
>  * more real-world useful filters
>
>  * documentation and tests, obviously
>
> If all goes well, I would next move on to something like this:
>
> <%| cache %>
> A bunch of text here, including <% $more->stuff %>
> with maybe some <& /component/calls &>
> you know, lots of text, that would be annoying to put inside a
>   <% $substitution %>
> </%>
>
> (but let's paint that bikeshed after we're done with this one)
>
> hdp.
>
> ---------------------------------------------------------------------- 
> ---
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Mason-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mason-devel
>


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/