I know we've been around here before in some related topics, but I would appreciate some feedback on a possible MVC structure for a Titanium/CGI::App that I am currently building.

I'm using CA::Dispatch to allow multiple apps with a small number of rm's each. Views are handled by CAP::TT. Just the Model aspect is proving a little challenging. I'm trying to ensure that all database calls are handled outside the controllers, and to this end am using a module called WebApp::Model

#####################
package WebApp::Model;

BEGIN {
  setmoduledirs('/path/to/app'); # Module::Find
  useall WebApp::DB; # Rose::DB::Object classes
}

sub new {
    my $class = shift;
    bless { }, $class;
}

sub get_foo { }
sub update_bar { }
sub delete_baz { }
#####################

WebApp::Model initially loads all WebApp::DB::* (Rose::DB::Object) classes, and is made available to the WebApp object via cgiapp_init:

#################
sub cgiapp_init {
  my $c = shift;
  ..
  $c->param( 'model' => WebApp::Model->new );
}
################

Each controller run-mode uses $c->param( 'model') to get its data:

######################################
sub foo : Runmode { # CAP::AutoRunmode
  my $c = shift;
  ..
  my $data = $c->param('model')->get_foo;
}
######################################

This seems to work well, but the problem is that WebApp::Model is growing, as ever more (unrelated) db-related methods are added. Perhaps I could/should sub-class this one? Ideally I would move the WebApp::Model methods into their respective WebApp::DB class (eg get_foo() goes into WebApp::DB::Foo), but then I can't access it any longer from $c->param('model')->get_foo.

But the main question is whether this is the right approach to start with - stuffing WebApp::Model into the WebApp object and retrieving it in the run-modes via a param_name. Advantages include decoupling the model from the controllers - they don't know/care how get_foo() gets its data, and I can change the db-related stuff (eg RDBO <=> DBIC) without affecting the controllers. Disadvantage (so far) is lumping all methods into one (WebApp::Model) module. Comments & thoughts most welcome.
--
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/                 ##
##                                                            ##
################################################################

Reply via email to