I may be off the mark on what you're trying to do, but here goes.
In my brief experience with catalyst, inheritance doesn't do much for
you when constructing actions.
I believe that chained actions are pretty tightly bound to the urls
you are building, so there's no way to reuse them for different urls.
That said, something I often do is $c->forward my way to common
private functions, rather than try to do it through inheritance. So,
from that same project:
sub find_tutorial :Chained('/') PathPart('tutorials') CaptureArgs(1) {
$_[1]->forward('/exists',['tutorial' => 'Tutorial' => $_[2] ])
}
sub find_comment :Chained('find_tutorial') PathPart('comments')
CaptureArgs(1) {
$_[1]->forward('/exists',['comment' => 'Comment::Thread' =>
$_[2] ])
}
where, 'exists' is defined in my root controller as:
sub exists :Private {
my( $self, $c, $name, $class, $id ) = @_;
unless( $c->stash->{$name} = $c->model("DB::$class")->find($id) ) {
$c->res->status('404');
$c->detach('/default');
}
}
HTH
Stephen
On Jun 29, 2010, at 6:06 AM, John Lifsey - Contractor - 5595 wrote:
On 6/25/10 12:08 PM, Stephen Howard wrote:
/tutorials
/tutorials/*
/tutorials/*/comments
/tutorials/*/comments/*
/tutorials/*/comments/*/replies
/tutorials/*/comments/*/replies/*
#
------------------------------------------------------------------------------
sub list :Chained('/') PathPart('tutorials') Args(0) :
ActionClass('REST') {}
sub list_GET { ... }
sub list_POST { ... }
sub list_HEAD { ... }
#
------------------------------------------------------------------------------
sub find_tutorial :Chained('/') PathPart('tutorials')
CaptureArgs(1) {
... }
#
------------------------------------------------------------------------------
sub single :Chained('find_tutorial') PathPart('') Args(0)
ActionClass('REST') { ... }
sub single_GET { ... }
sub single_POST { ... }
#
------------------------------------------------------------------------------
sub comments :Chained('find_tutorial') PathPart('comments') Args(0)
Well, if you teach a man to fish, apparently he'll ask you to teach
him how to fly spaceships next.
While this example worked well, it led me to another related
problem. I have a parent Controller class for typical behavior on a
resource from which I inherit and override as needed for each type
of resource.
package MyBaseController;
extends 'Catalyst::Controller::REST';
sub index : Chained PathPrefix Args(0) ActionClass('REST') {}
sub find : Chained PathPrefix CaptureArgs(1) {}
sub single : Chained('find') PathPart('') Args(0) {}
etc..
1;
Using the previous poster's example this works just fine in
MyApp::Controller::Tutorial
but it will not work for MyApp::Controller::Tutorial::Comments
At first, from looking at the documentation I thought that setting
the controller config key "path" to a regex or "/tutorial/*/" might
do the trick, but alas it does not.
This is further complicated by my desire to break from the previous
example and allow Comments to be at the same hierarchical level as
Tutorial. That is to say:
MyApp::Controller::Tutorial ISA MyBaseController;
and
MyApp::Controller::Comments ISA MyBaseController;
So that I could reference a particular comment ID at /myapp/comments/
* or at /myapp/tutorial/*/comments/*
Upon documentation review I thought __PACKAGE__-
>config(action=>{'*'=>{ blah, blah }}); would be my salvation, but
it appears that '*' doesn't actually work in myapp, at least as
written in the documentation.
Now that I've gotten myself worked entirely into a lather thinking
in circles it's time to request insight from the crowd. Any
suggestions?
_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/
_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/