1 package Maypole::Model::Base;
3 sub MODIFY_CODE_ATTRIBUTES { $remember{ $_[1] } = $_[2]; () }
5 sub FETCH_CODE_ATTRIBUTES { $remember{ $_[1] } }
14 my ( $class, $r ) = @_;
15 my $method = $r->action;
16 return if $r->{template}; # Authentication has set this, we're done.
18 $r->{template} = $method;
20 my $obj = $class->retrieve( $r->{args}->[0] );
22 $r->objects( [$obj] );
23 shift @{ $r->{args} };
25 $class->$method( $r, $obj, @{ $r->{args} } );
34 Maypole::Model::Base - Base class for model classes
38 Anyone subclassing this for a different database abstraction mechanism
39 needs to provide the following methods:
43 If there is an object in C<$r-E<gt>objects>, then it should be edited
44 with the parameters in C<$r-E<gt>params>; otherwise, a new object should
45 be created with those parameters, and put back into C<$r-E<gt>objects>.
46 The template should be changed to C<view>, or C<edit> if there were any
47 errors. A hash of errors will be passed to the template.
51 sub do_edit { die "This is an abstract method" }
55 $model->setup_database($config, $namespace, @data)
57 Uses the user-defined data in C<@data> to specify a database- for
58 example, by passing in a DSN. The model class should open the database,
59 and create a class for each table in the database. These classes will
60 then be C<adopt>ed. It should also populate C<< $config->{tables} >> and
61 C<< $config->{classes} >> with the names of the classes and tables
62 respectively. The classes should be placed under the specified
63 namespace. For instance, C<beer> should be mapped to the class
68 $model->class_of($r, $table)
70 This maps between a table name and its associated class.
74 This turns an ID into an object of the appropriate class.
78 This is called on an model class representing a table and allows the
79 master model class to do any set-up required.
83 This can go either in the master model class or in the individual
84 classes, and returns a list of has-many accessors. A brewery has many
85 beers, so C<BeerDB::Brewery> needs to return C<beers>.
89 This is a list of all the columns in a table. You may also override
90 C<display_columns>, which is the list of columns you want to view, in
95 This is the name of the table.
103 The C<list> method should fill C<< $r-> objects >> with all of the
104 objects in the class. You may want to page this using C<Data::Page> or
111 sub class_of { die "This is an abstract method" }
112 sub setup_database { die "This is an abstract method" }
114 sub list : Exported {
115 die "This is an abstract method";
120 Also, see the exported commands in C<Maypole::Model::CDBI>.
122 =head1 Other overrides
124 Additionally, individual derived model classes may want to override the
129 Return a hash mapping column names with human-readable equivalents.
137 $col =~ s/_+(\w)?/ \U$1/g;
144 A description of the class to be passed to the template.
148 sub description { "A poorly defined class" }