[Catalyst] Best way to have the controller do something just one time

John Napiorkowski jjn1056 at yahoo.com
Sun Sep 3 03:14:30 CEST 2006


There is some initialization stuff I like to do the
first time a controller is loaded up.  I've been doing
it this way (shown to me a looooong time ago here on
this group):

sub begin :Private
   ($self, $c) = @_;

   unless( $self->{__init})
      ## do your one time init here

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.

So I was looking around at some plugins and other
controllers to see what other people are doing for
this, if there was a more elegant solution for an
elegant framework.  I noticed some use of over-ridding
the COMPONENT method, but I just can't get this to
work for me.  I looked at the source for this and it
leaves me with the impression you can get some sort of
$self and $context for the controller (although this
gets called before any requests I have to wonder what
kind of context it is) but I just get all sort of
errors when I try to use it.

Here's one example that doesn't work.  Please don't
laugh too hard at me:

  my $self	= shift->SUPER::new(shift @_);
  my ($c)	= @_;
  my $service	= 'feedrolls';

  $self->{service} =  
  return $self;

I'm sure I'm totally buggering up this example but I
hope it illustrates what I am trying to do.  The error
in this case is that $c is an unblessed reference,

I'd appreciate some suggestions.  Perhaps if people
throw in some other good things they did when building
base controllers it might serve as a reference for a
FAQ on this subject?  We already have a plugin
writer's guide, but as a recent discussion on this
list suggested, it might be better for a lot of stuff
to be base controllers or other components.



Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 

More information about the Catalyst mailing list