[Catalyst] I am misunderstanding something about Private actions

Jason Kohles email at jasonkohles.com
Mon Jan 7 16:19:59 GMT 2008


On Jan 5, 2008, at 6:48 PM, Joe Landman wrote:

> Hi folks:
>
>  Thought I had this nailed, but it looks like I really didn't  
> understand it as I should have.
>
>  Here is the problem.  I want to forward to some private actions to  
> simplify the application (and avoid repeating myself).  I want to be  
> able to do this from any controller in the code.  So in reading the  
> manual, I thought I was supposed to do
>
> 	$c->forward('MyApp::Root::do_something');
>
Close, but it should be $c->forward( 'MyApp::Root', 'do_something' );

 From Catalyst.pm:

        $c->forward( $class, $method, [, \@arguments ] )

        Forwards processing to another action, by its private name. If  
you give
        a class name but no method, "process()" is called. You may also
        optionally pass arguments in an arrayref. The action will  
receive the
        arguments in @_ and "$c->req->args". Upon returning from the  
function,
        "$c->req->args" will be restored to the previous values.

        Any data "return"ed from the action forwarded to, will be  
returned by
        the call to forward.

            my $foodata = $c->forward('/foo');
            $c->forward('index');
            $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/);     #  
<--------
            $c->forward('MyApp::View::TT');


> and not
>
> 	$c->forward('/do_something');
>
> The latter works, the former does not.  Is this intended?  Are both  
> supposed to work?
>
> On a related note, I like naming my internal methods with an  
> underscore up front.  Yeah, maybe not the best practice these days,  
> but call it an old habit.  What I noticed was that private  methods  
> named _do_something didn't seem to show up in the private list.   
> Confused me a bit.  Should I avoid that practice with Catalyst?   
> Just name them INTERNAL_METHOD_do_something  or something like  
> that?  Well, you get the idea ...
>
There is a configuration option you can set to not have actions  
starting with an underscore supressed (MyApp->config- 
 >{ 'show_internal_actions' } = 1), but if you enable it you will also  
get all of Catalyst's internal actions (_DISPATCH, _BEGIN, _AUTO,  
_ACTION, _END)

Besides, if you are forwarding to them, they aren't really internal,  
are they?

-- 
Jason Kohles, RHCA RHCDS RHCE
email at jasonkohles.com - http://www.jasonkohles.com/
"A witty saying proves nothing."  -- Voltaire





More information about the Catalyst mailing list