[Catalyst] experiences using Catalyst::Controller::BindLex?
Yuval Kogman
nothingmuch at woobling.org
Mon May 1 14:51:06 CEST 2006
On Mon, May 01, 2006 at 03:02:15 -0700, John Napiorkowski wrote:
> Hi,
>
> I like to get some feedback from people using the
> Catalyst::Controller::BindLex module. This module
> really seems added a lot to the appearence and ease of
> use in handling stashed and session info. I see this
> being used all over the source code for Agave and it
> just really makes sense if I could use it as well.
Yay
> However I can see why it's not part of the core
> catalyst, since it is very difficult to install.
>
> What I am asking is for people who are using this to
> give some comments about it's stability in production
> systems as well as if they just force installed some
> of the most troublesome modules, such as Devel::Caller
> (which appears to be broken for perl 5.8.1 and up if
> the notes in the tests are correct).
Hmm.. I usded Devel::Caller before writing BindLex, always with >
5.8.3 (since that's pretty much the first version of Perl I wrote
seriously with), so I don't think that's the case ;-)
Have you tried talking with Richard Clamp? I don't see a pattern
from the test failure reports on CPAN testers
(http://cpantesters.perl.org/show/Devel-Caller.html#Devel-Caller-0.09).
Admittedly these modules *do* explode, hence the large warning. =/
Have you considered an editor macro instead? It doesn't help with
code readability, but it does let you write faster.
> Makes me wish I understood enough about attributes to
> rewrite this using more modern and well supported
> modules.
The problem is not with the attributes, it's with:
1. the fact that the attribute handler has to walk up the stack
to look for $c. Although Devel::Caller::Perl also supports
argument extraction, see point 4.
2. the fact that aliasing is not well supported in the sense
that you need to do it with optional modules (Data::Alias, or
Array::RefElem and Devel::LexAlias which I used)
3. Lexical pads must be walked using PadWalker, as they are also
not exposed by Perl itself.
4. To use PadWalker to open up a lexical pad we need that
subroutine's code reference, which is a feature that only
Devel::Caller provides (hence not using Devel::Caller::Perl).
The following features are implemented with corresponding magic. If
you like to give some of the features up I will be happy to help you
implement an easier to install alternative to BindLex:
attribute syntax - no magic at all - when the variable
allocation is ready a method on the current package is
called, with the reference to the subroutine and all the
attributes that were collected
no need to specify $c - This is implemented by _get_c_obj, which
walks up the stack.
no need to specify variable name - this is implemented by
_find_in_pad, which takes a reference and a call level and
locate the subroutine in that lexical pad, and uses it's name
(minus the symbol) for the pad entry
aliasing semantics - the behavior that allows variables to be
read/write consistently accross subs is implemented using
Devel::LexAlias and Array::RefElem. This is implemented by
_bind_lex which takes $c, the hash to bind to, a reference to
the variable, and the hash key to store under.
Note that attributes cannot take "perlish" arguments - they only get
strings ( : Stashed($c) won't work ), so that's what part of the
fussing is about.
Ciao
--
Yuval Kogman <nothingmuch at woobling.org>
http://nothingmuch.woobling.org 0xEBD27418
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 191 bytes
Desc: not available
Url : http://lists.rawmode.org/pipermail/catalyst/attachments/20060501/cfdfa359/attachment.pgp
More information about the Catalyst
mailing list