[Catalyst] Another thread about porting to CataMoose
Tomas Doran
bobtfish at bobtfish.net
Mon May 18 09:27:46 GMT 2009
J. Shirley wrote:
> While an obvious blunder to make while coding, I wasn't alerted to
> anything and the application started with no warnings and no indication
> that something was wrong. The only thing is that my 'rpx' method no
> longer was dispatchable.
>
> Oops.
Hmm, I think that this is actually by design:
http://search.cpan.org/~drolsky/Moose-0.79/lib/Moose/Manual/FAQ.pod#I_created_an_attribute,_where_are_my_accessors?
I'm sure there is a better explanation somewhere, but I can't find it
right now.
> So, I'm pretty far out of my depth for 5.8 but I'd be happy to commit a
> failing test case -- is the proper test case a situation like this, and
> failing if the method doesn't define a dispatchable path or something
> else? I can imagine this is something that could commonly come up and
> bite people who aren't careful (or working with thick controllers)
I don't think there's any great way to get around this which I can think
of right now.
The best solution I could come up with is to make Catalyst::Controller
apply a default attribute trait which warned when (Moose) attributes
were added which overrode methods with (perl) attributes.
If you'd like to commit TODO tests (there is already a Moose specific
controller in the test suite) which test for an appropriate warning
being emitted during app startup, then I'll have a crack at seeing if I
can do something sane enough to be maintainable..
> package MyApp::Controller::Auth;
>
> use parent 'Catalyst::Controller';
>
> use Moose;
>
> has 'rpx' => ( is => 'rw' );
>
> sub rpx : Chained('/') Args(0) { }
>
> 1;
Note this pattern works, but is mildly disrecommended going forwards.
There are tests in the test suite that it works in basic cases, but it's
not what people are using - so I wouldn't be confident it will stay
working for non-trivial cases (I have already fixed bugs with doing it
this way round).
My Moose native controllers look like this:
package MyApp::Controller::Auth;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
# Attributes and actions
__PACKAGE__->meta->make_immutable; # Note this returns true, so is good
for the last line
I did scribble _some_ stuff in Catalyst::Manual::ExtendingCatalyst about
this, but if you'd like to add anything (or at least tell us what it's
missing currently), that'd be awesome?
Cheers
t0m
More information about the Catalyst
mailing list