I wrote Sledge::Model.
This module is EXPERIMENTAL!
package Sledge::Model; use strict; use warnings; our $VERSION = 0.01; use Sledge::Exceptions;
sub new { my ($class, $page) = @_; return bless {page => $page}, $class; }
1;
package Sledge::Model::CDBI; use strict; use warnings; use base 'Sledge::Model'; use UNIVERSAL::require;
sub get { my ($self, $name) = @_; my $cdbi = $self->_get_class; my $cdbi_class = "$cdbi\::$name"; $cdbi_class->use or die $@; return $cdbi_class; }
sub _get_class { shift->{page}->config->{cdbi_class} }
1;
package Sledge::Model::DBIC::Schema; use strict; use base qw/Sledge::Model/; use UNIVERSAL::require; our $VERSION = '0.01';
sub new { my $class = shift; my $self = $class->SUPER::new(@_); $self->connect; }
sub connect { my $self = shift; my $schema_class = $self->{page}->config->{schema_class}; $schema_class->use or die $@; return $schema_class->connect($self->{page}->config->datasource); }
1;
package Sledge::Plugin::Model; use strict; use warnings; our $VERSION = '0.01'; use Sledge::Exceptions;
sub import { my $self = shift; my $pkg = caller;
$pkg->mk_accessors('model'); $pkg->add_trigger(AFTER_INIT => sub { my $self = shift; $self->model($self->create_model); });
{ no strict 'refs'; ## no critic *{"$pkg\::create_model"} = sub { Sledge::Exception::AbstractMethod->throw }; } }
1;
cdbi_class: Proj::Data datasource: - dbi:mysql:proj - user - passwd
sub create_model { Sledge::Model::CDBI->new(shift) }
sub dispatch_index { my $self = shift; my $memo = $self->model->get('Memo')->retrieve_all; }
schema_class: Proj::Schema datasource: - dbi:mysql:proj - user - passwd
sub create_model { Sledge::Model::DBIC::Schema->new(shift) }
sub dispatch_index { my $self = shift; my $memo = $self->model->resultset('Hoge')->search({}); }