1 package Maypole::Model::Base;
4 use Maypole::Constants;
7 # don't know why this is a global - drb
10 sub MODIFY_CODE_ATTRIBUTES
12 shift; # class name not used
13 my ($coderef, @attrs) = @_;
15 $remember{$coderef} = \@attrs;
17 # previous version took care to return an empty array, not sure why,
18 # but shall cargo cult it until know better
22 sub FETCH_CODE_ATTRIBUTES { @{ $remember{$_[1]} || [] } }
25 my ( $class, $r ) = @_;
26 my $method = $r->action;
28 $r->{template} = $method;
29 my $obj = $class->fetch_objects($r);
30 $r->objects([$obj]) if $obj;
32 $class->$method( $r, $obj, @{ $r->{args} } );
36 shift->display_columns;
45 Maypole::Model::Base - Base class for model classes
49 This is the base class for Maypole data models. This is an abstract class
50 that defines the interface, and can't be used directly.
54 This is the engine of this module. Given the request object, it populates
55 all the relevant variables and calls the requested action.
57 Anyone subclassing this for a different database abstraction mechanism
58 needs to provide the following methods:
62 $model->setup_database($config, $namespace, @data)
64 Uses the user-defined data in C<@data> to specify a database- for
65 example, by passing in a DSN. The model class should open the database,
66 and create a class for each table in the database. These classes will
67 then be C<adopt>ed. It should also populate C<< $config->tables >> and
68 C<< $config->classes >> with the names of the classes and tables
69 respectively. The classes should be placed under the specified
70 namespace. For instance, C<beer> should be mapped to the class
75 $model->class_of($r, $table)
77 This maps between a table name and its associated class.
81 This class method is passed a request object and is expected to return an
82 object of the appropriate table class from information stored in the request
87 This class method is passed the name of a model class that represensts a table
88 and allows the master model class to do any set-up required.
92 This is a list of all the columns in a table. You may also override
93 see also C<display_columns>
97 This is the name of the table.
101 sub class_of { die "This is an abstract method" }
102 sub setup_database { die "This is an abstract method" }
103 sub fetch_objects { die "This is an abstract method" }
111 If there is an object in C<$r-E<gt>objects>, then it should be edited
112 with the parameters in C<$r-E<gt>params>; otherwise, a new object should
113 be created with those parameters, and put back into C<$r-E<gt>objects>.
114 The template should be changed to C<view>, or C<edit> if there were any
115 errors. A hash of errors will be passed to the template.
119 sub do_edit { die "This is an abstract method" }
123 The C<list> method should fill C<$r-E<gt>objects> with all of the
124 objects in the class. You may want to page this using C<Data::Page> or
137 Empty Action, calls list if provided with a table.
143 sub list : Exported {
144 die "This is an abstract method";
147 sub view : Exported {
150 sub edit : Exported {
153 sub index : Exported {
154 my ( $self, $r ) = @_;
156 $r->template("list");
157 return $self->list($r);
163 Also, see the exported commands in C<Maypole::Model::CDBI>.
165 =head1 Other overrides
167 Additionally, individual derived model classes may want to override the
170 =head2 display_columns
172 Returns a list of columns to display in the model. By default returns
173 all columns in alphabetical order. Override this in base classes to
174 change ordering, or elect not to show columns.
178 Same as display_columns, only for listings. Defaults to display_columns
182 Return a hash mapping column names with human-readable equivalents.
190 $col =~ s/_+(\w)?/ \U$1/g;
197 should return true if a certain action is supported, or false otherwise.
198 Defaults to checking if the sub has the C<:Exported> attribute.
203 my ( $self, $action, $attrs ) = @_;
204 my $cv = $self->can($action);
205 warn "is_public failed . action is $action. self is $self" and return 0 unless $cv;
207 my %attrs = (ref $attrs) ? %$attrs : map {$_ => 1} $self->method_attrs($action,$cv) ;
210 warn "is_public failed. $action not exported. attributes are : ", %attrs;
212 } unless $attrs{Exported};
217 =head2 add_model_superclass
219 Adds model as superclass to model classes (if necessary)
223 sub add_model_superclass { return; }
227 Returns the list of attributes defined for a method. Maypole itself only
228 defines the C<Exported> attribute.
233 my ($class, $method, $cv) = @_;
235 $cv ||= $class->can($method);
239 my @attrs = attributes::get($cv);
246 This can go either in the master model class or in the individual
247 classes, and returns a list of has-many accessors. A brewery has many
248 beers, so C<BeerDB::Brewery> needs to return C<beers>.
260 L<Maypole>, L<Maypole::Model::CDBI>.
264 Maypole is currently maintained by Aaron Trevena.
266 =head1 AUTHOR EMERITUS
268 Simon Cozens, C<simon#cpan.org>
270 Simon Flack maintained Maypole from 2.05 to 2.09
272 Sebastian Riedel, C<sri#oook.de> maintained Maypole from 1.99_01 to 2.04
276 You may distribute this code under the same terms as Perl itself.