[Catalyst] setup() called twice
Matt S Trout
dbix-class at trout.me.uk
Tue Jun 19 15:42:04 GMT 2007
On Mon, Jun 18, 2007 at 01:27:07PM -0700, Quinn Weaver wrote:
> On Mon Jun 18 20:04:09 GMT 2007, Matt Trout wrote:
> On Mon, Jun 18, 2007 at 11:50:06AM -0700, Quinn Weaver wrote:
>
> > Hi, all,
> >
> > During some debugging, I noticed that MyApp::setup is called twice.
> > This looks like an intentional feature. My question is, why?
> >
> > From MyApp.pm:
> >
> > my $ret = $self->SUPER::setup( @_ );
> >
> > From Catalyst.pm:
> >
> > # Call plugins setup
> > {
> > no warnings qw/redefine/;
> > local *setup = sub { };
> > $class->setup;
> > }
> >
> > Yep, the latter code locally redefines the parent class setup to a
> > no-op in order to prevent an infinite loop, then calls the child class
> > (MyApp) setup. The effect is that every line in MyApp::setup is
> > executed twice.
>
> > No it isn't. The redefine means it -isn't- called a second time.
>
> Yes it is. You can verify this by running myapp_server.pl under the debugger,
> or by putting lines like this in MyApp::setup:
>
> warn "setup called by process $$ at ", scalar localtime();
Sorry, I read Catalyst::setup for MyApp::setup - I never have direct
setup code in my app class, since I tend to handle everything I can
via model/view/controller components rather than turning MyApp into a god
object (not to say you are, but that's my motivation ...)
I'd be fairly willing to say this is a bug and it should be doing
{
no strict 'refs';
no warnings 'redefine';
local *{"${appclass}::setup"} = sub { shift->NEXT::setup(@_); };
local *setup = sub {};
$app->setup;
}
Maybe somebody could put together a test case for this behaviour?
--
Matt S Trout Need help with your Catalyst or DBIx::Class project?
Technical Director Want a managed development or deployment platform?
Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote
http://chainsawblues.vox.com/ http://www.shadowcatsystems.co.uk/
More information about the Catalyst
mailing list