[Catalyst] Best way to have the controller do something just one time
Jonathan Rockway
jon at jrock.us
Sun Sep 3 08:59:30 CEST 2006
> This works although if feels like a hack that left one
> of my Java peers snickering as well as incurs a minor
> penalty for each request.
>
Yeah, please don't do that. :)
> sub COMPONENT
>
So does new() not work? That's what I would use for initializing my class.
All your Models/Views/Controllers are instantiated at app start time by
Catalyst. If this is when you want config to happen, use new(). You
can also use c->config->{MyApp::Controller::Whatever}->{service} =
$c->model(...) inside MyApp.pm. (And then use Class::Accessor inside
your class; but that's not required.)
> {
> my $self = shift->SUPER::new(shift @_);
> my ($c) = @_;
>
> my $service = 'feedrolls';
>
> $self->{service} =
> $c->model('db::services::services');
>
> return $self;
> }
>
You're shifting a few too many times, I think. Try:
my $self = shift;
$self = $self->NEXT::new(@_);
my $c = shift;
...
instead. Note NEXT instead of SUPER; Catalyst uses NEXT (at the
moment). You might also like Class::C3 or Catalyst::Plugin::C3 instead.
As a last resort, if you want the method to be called the first time
begin() is called, you can simply remove your begin from the symbol
table the first time through:
sub begin {
...
undef $PACKAGE::{begin}
}
I haven't tried this, but it should work. (I tested it inside main::,
and I had to type main instead of __PACKAGE__. You'll probably have to
do the same. Also, be aware of the side effects by reading the manual
page.)
Let us know how it goes.
Manual pages to read:
* NEXT
* Class::C3
* "Symbol Tables" in perlmod
Regards,
Jonathan Rockway
More information about the Catalyst
mailing list