This is definitely a step forward, and in a similar direction of what I'm doing now (my solution is nasty and dirty but been working for me).My hesitation with this method is more philosophycal, since a Model creation depends on a Controller method (which I try to avoid, because of personal preferences)
I started to think in this after a brief incursion in Rails. On Rails, on your controllers you dont need to use/import anything to be able to instantiate your Models. I dont know how Rails handles that (haven't investigated on that subject) but I considered a wonderful feature to have, making each Controller code easier to write and maintain (no more errors because I forgot to use some package) On Thu, Jun 11, 2009 at 8:42 PM, Richard Jones <[email protected]>wrote: > Porta wrote: > > In order to make my Models available on each Controller. Of course, I >> could >> create a CGI::App package, add all the use lines there and base all my >> Controllers on that package. Sure, less lines to type on each Controller. >> >> But, every time I create a new Model, I need to make sure I added it on >> that >> base package. Which I found annoying. >> >> So, the question is: Does anyone knows a way to *solve* this ( I >> understand >> it's not really a problem, but more a matter of personal preference ) >> other >> than having a CA based package including all the packages under Models/ >> and >> make all the Controllers inherit from that package? >> > > Well, one way is to use a method which returns either a stashed or > newly-created model object, like this: > > package MyApp::Base; > > sub model { > my ($self, $classname) = @_; > > # return stashed package object if it exists: > if ( my $stashed = $self->stash->{"model::$classname"} ) { > return $stashed; > } > > my $package = "MyApp::Model::$classname"; > > unless (eval "require $package") { > $self->error("Unable to load module [$package]."); > } > > # instantiate object > my $model = $package->new() > || $self->error("unable to instantiate [$package]."); > > # stash for future calls: > $self->stash->{"model::$classname"} = $model; > > return $model; > } > > Then each controller inherits from MyApp::Base (you don't even strictly > need that level of complexity), and its methods call the model methods as eg > $self->model('User')->some_method(\%args), where 'User' equates to > MyApp::Model::User, and contains all the user-related methods. And I don't > have to worry about adding new Model classes to any list of modules, just > call them as required. Not sure if that exactly chimes with what you wanted > though. > -- > Richard Jones > > > ##### CGI::Application community mailing list ################ > ## ## > ## To unsubscribe, or change your message delivery options, ## > ## visit: http://www.erlbaum.net/mailman/listinfo/cgiapp ## > ## ## > ## Web archive: http://www.erlbaum.net/pipermail/cgiapp/ ## > ## Wiki: http://cgiapp.erlbaum.net/ ## > ## ## > ################################################################ > > ##### CGI::Application community mailing list ################ ## ## ## To unsubscribe, or change your message delivery options, ## ## visit: http://www.erlbaum.net/mailman/listinfo/cgiapp ## ## ## ## Web archive: http://www.erlbaum.net/pipermail/cgiapp/ ## ## Wiki: http://cgiapp.erlbaum.net/ ## ## ## ################################################################
