1 package Maypole::Model::Base;
5 use Maypole::Constants;
8 # don't know why this is a global - drb
11 sub MODIFY_CODE_ATTRIBUTES
13 shift; # class name not used
14 my ($coderef, @attrs) = @_;
16 $remember{$coderef} = \@attrs;
18 # previous version took care to return an empty array, not sure why,
19 # but shall cargo cult it until know better
23 sub FETCH_CODE_ATTRIBUTES { @{ $remember{$_[1]} || [] } }
26 my ( $class, $r ) = @_;
27 my $method = $r->action;
28 return if $r->{template}; # Authentication has set this, we're done.
30 $r->{template} = $method;
31 my $obj = $class->fetch_objects($r);
32 $r->objects([$obj]) if $obj;
34 $class->$method( $r, $obj, @{ $r->{args} } );
38 shift->display_columns;
47 Maypole::Model::Base - Base class for model classes
51 This is the base class for Maypole data models. This is an abstract class
52 that defines the interface, and can't be used directly.
56 This is the engine of this module. Given the request object, it populates
57 all the relevant variables and calls the requested action.
59 Anyone subclassing this for a different database abstraction mechanism
60 needs to provide the following methods:
64 $model->setup_database($config, $namespace, @data)
66 Uses the user-defined data in C<@data> to specify a database- for
67 example, by passing in a DSN. The model class should open the database,
68 and create a class for each table in the database. These classes will
69 then be C<adopt>ed. It should also populate C<< $config->tables >> and
70 C<< $config->classes >> with the names of the classes and tables
71 respectively. The classes should be placed under the specified
72 namespace. For instance, C<beer> should be mapped to the class
77 $model->class_of($r, $table)
79 This maps between a table name and its associated class.
83 This class method is passed a request object and is expected to return an
84 object of the appropriate table class from information stored in the request
89 This class method is passed the name of a model class that represensts a table
90 and allows the master model class to do any set-up required.
94 This is a list of all the columns in a table. You may also override
95 see also C<display_columns>
99 This is the name of the table.
103 sub class_of { die "This is an abstract method" }
104 sub setup_database { die "This is an abstract method" }
105 sub fetch_objects { die "This is an abstract method" }
113 If there is an object in C<$r-E<gt>objects>, then it should be edited
114 with the parameters in C<$r-E<gt>params>; otherwise, a new object should
115 be created with those parameters, and put back into C<$r-E<gt>objects>.
116 The template should be changed to C<view>, or C<edit> if there were any
117 errors. A hash of errors will be passed to the template.
121 sub do_edit { die "This is an abstract method" }
125 The C<list> method should fill C<$r-E<gt>objects> with all of the
126 objects in the class. You may want to page this using C<Data::Page> or
139 Empty Action, calls list if provided with a table.
145 sub list : Exported {
146 die "This is an abstract method";
149 sub view : Exported {
152 sub edit : Exported {
155 sub index : Exported {
156 my ( $self, $r ) = @_;
158 $r->template("list");
159 return $self->list($r);
165 Also, see the exported commands in C<Maypole::Model::CDBI>.
167 =head1 Other overrides
169 Additionally, individual derived model classes may want to override the
172 =head2 display_columns
174 Returns a list of columns to display in the model. By default returns
175 all columns in alphabetical order. Override this in base classes to
176 change ordering, or elect not to show columns.
180 Same as display_columns, only for listings. Defaults to display_columns
184 Return a hash mapping column names with human-readable equivalents.
192 $col =~ s/_+(\w)?/ \U$1/g;
199 should return true if a certain action is supported, or false otherwise.
200 Defaults to checking if the sub has the C<:Exported> attribute.
205 my ( $self, $action, $attrs ) = @_;
206 my $cv = $self->can($action);
207 warn "is_public failed . action is $action. self is $self" and return 0 unless $cv;
209 my %attrs = (ref $attrs) ? %$attrs : map {$_ => 1} $self->method_attrs($action,$cv) ;
212 warn "is_public failed. $action not exported. attributes are : ", %attrs;
214 } unless $attrs{Exported};
219 =head2 add_model_superclass
221 Adds model as superclass to model classes (if necessary)
225 sub add_model_superclass { return; }
229 Returns the list of attributes defined for a method. Maypole itself only
230 defines the C<Exported> attribute.
235 my ($class, $method, $cv) = @_;
237 $cv ||= $class->can($method);
241 my @attrs = attributes::get($cv);
248 This can go either in the master model class or in the individual
249 classes, and returns a list of has-many accessors. A brewery has many
250 beers, so C<BeerDB::Brewery> needs to return C<beers>.
262 L<Maypole>, L<Maypole::Model::CDBI>.
266 Maypole is currently maintained by Aaron Trevena.
268 =head1 AUTHOR EMERITUS
270 Simon Cozens, C<simon#cpan.org>
272 Simon Flack maintained Maypole from 2.05 to 2.09
274 Sebastian Riedel, C<sri#oook.de> maintained Maypole from 1.99_01 to 2.04
278 You may distribute this code under the same terms as Perl itself.