| Maypole documentation | Contained in the Maypole distribution. |
Maypole::Model::Base - Base class for model classes
This is the base class for Maypole data models. This is an abstract class that defines the interface, and can't be used directly.
This is the engine of this module. Given the request object, it populates all the relevant variables and calls the requested action.
Anyone subclassing this for a different database abstraction mechanism needs to provide the following methods:
$model->setup_database($config, $namespace, @data)
Uses the user-defined data in @data to specify a database- for
example, by passing in a DSN. The model class should open the database,
and create a class for each table in the database. These classes will
then be adopted. It should also populate $config->tables and
$config->classes with the names of the classes and tables
respectively. The classes should be placed under the specified
namespace. For instance, beer should be mapped to the class
BeerDB::Beer.
$model->class_of($r, $table)
This maps between a table name and its associated class.
This class method is passed a request object and is expected to return an object of the appropriate table class from information stored in the request object.
This class method is passed the name of a model class that represensts a table and allows the master model class to do any set-up required.
This is a list of all the columns in a table. You may also override
see also display_columns
This is the name of the table.
If there is an object in $r->objects, then it should be edited
with the parameters in $r->params; otherwise, a new object should
be created with those parameters, and put back into $r->objects.
The template should be changed to view, or edit if there were any
errors. A hash of errors will be passed to the template.
The list method should fill $r->objects with all of the
objects in the class. You may want to page this using Data::Page or
similar.
Empty Action.
Empty Action.
Empty Action, calls list if provided with a table.
Also, see the exported commands in Maypole::Model::CDBI.
Additionally, individual derived model classes may want to override the following methods:
Returns a list of columns to display in the model. By default returns all columns in alphabetical order. Override this in base classes to change ordering, or elect not to show columns.
Same as display_columns, only for listings. Defaults to display_columns
Return a hash mapping column names with human-readable equivalents.
should return true if a certain action is supported, or false otherwise.
Defaults to checking if the sub has the :Exported attribute.
Adds model as superclass to model classes (if necessary)
Returns the list of attributes defined for a method. Maypole itself only
defines the Exported attribute.
Maypole is currently maintained by Aaron Trevena.
Simon Cozens, simon#cpan.org
Simon Flack maintained Maypole from 2.05 to 2.09
Sebastian Riedel, sri#oook.de maintained Maypole from 1.99_01 to 2.04
You may distribute this code under the same terms as Perl itself.
| Maypole documentation | Contained in the Maypole distribution. |
package Maypole::Model::Base; use strict; use Maypole::Constants; use attributes (); # don't know why this is a global - drb our %remember; sub MODIFY_CODE_ATTRIBUTES { shift; # class name not used my ($coderef, @attrs) = @_; $remember{$coderef} = [$coderef, \@attrs]; # previous version took care to return an empty array, not sure why, # but shall cargo cult it until know better return; } sub FETCH_CODE_ATTRIBUTES { @{ $remember{$_[1]}->[1] || [] } } sub CLONE { # re-hash %remember for my $key (keys %remember) { my $value = delete $remember{$key}; $key = $value->[0]; $remember{$key} = $value; } } sub process { my ( $class, $r ) = @_; my $method = $r->action; $r->{template} = $method; my $obj = $class->fetch_objects($r); $r->objects([$obj]) if $obj; $class->$method( $r, $obj, @{ $r->{args} } ); } sub list_columns { shift->display_columns; } sub display_columns { sort shift->columns; }
sub class_of { die "This is an abstract method" } sub setup_database { die "This is an abstract method" } sub fetch_objects { die "This is an abstract method" }
sub do_edit { die "This is an abstract method" }
sub list : Exported { die "This is an abstract method"; } sub view : Exported { } sub edit : Exported { } sub index : Exported { my ( $self, $r ) = @_; if ($r->table) { $r->template("list"); return $self->list($r); } }
sub column_names { my $class = shift; map { my $col = $_; $col =~ s/_+(\w)?/ \U$1/g; $_ => ucfirst $col } $class->columns; }
sub is_public { my ( $self, $action, $attrs ) = @_; my $cv = $self->can($action); warn "is_public failed . action is $action. self is $self" and return 0 unless $cv; my %attrs = (ref $attrs) ? %$attrs : map {$_ => 1} $self->method_attrs($action,$cv) ; do { warn "is_public failed. $action not exported. attributes are : ", %attrs; return 0; } unless $attrs{Exported}; return 1; }
sub add_model_superclass { return; }
sub method_attrs { my ($class, $method, $cv) = @_; $cv ||= $class->can($method); return unless $cv; my @attrs = attributes::get($cv); return @attrs; }
sub related { } 1;