MySQL-ORM
view release on metacpan or search on metacpan
lib/MySQL/ORM/Generate/Class/Db.pm view on Meta::CPAN
package MySQL::ORM::Generate::Class::Db;
our $VERSION = '0.01';
use Modern::Perl;
use Moose;
use namespace::autoclean;
use Method::Signatures;
use Data::Printer alias => 'pdump';
use MySQL::Util::Lite;
use MySQL::ORM::Generate::Class::Table;
use MySQL::ORM::Generate::AttributeMaker;
use MySQL::ORM::Generate::MethodMaker;
use MySQL::ORM::Generate::Writer;
extends 'MySQL::ORM::Generate::Common';
##############################################################################
# required attributes
##############################################################################
has dir => (
is => 'ro',
isa => 'Str',
required => 1,
);
has tables => (
is => 'ro',
isa => 'ArrayRef',
required => 1,
);
has schema => (
is => 'rw',
isa => 'MySQL::Util::Lite::Schema',
required => 1,
);
##############################################################################
# optional attributes
##############################################################################
has namespace => (
is => 'ro',
isa => 'Str',
default => '',
);
##############################################################################
# private attributes
##############################################################################
has _db_name => (
is => 'rw',
isa => 'Str',
lazy => 1,
builder => '_build_db_name',
);
##############################################################################
# methods
##############################################################################
method generate {
$self->trace;
my @attr;
push @attr,
$self->attribute_maker->make_attribute(
name => 'db_name',
is => 'rw',
isa => 'Str',
no_init_arg => 1,
default => sprintf( "'%s'", $self->_db_name ),
);
foreach my $table ( @{ $self->tables } ) {
my $t = MySQL::ORM::Generate::Class::Table->new(
table => $table,
db_class_name => $self->get_class_name,
schema => $self->schema,
dir => $self->dir,
namespace => $self->namespace,
use_fq_table_names => $self->use_fq_table_names,
);
$t->generate;
push @attr,
$self->attribute_maker->make_attribute(
name => $self->camelize( $table->name ),
is => 'rw',
isa => $t->get_class_name,
no_init_arg => 1,
lazy => 1,
builder => '_build_table',
);
}
my @methods;
push @methods,
$self->method_maker->make_method(
name => '_build_table',
body => $self->_get_build_table_body
);
$self->writer->write_class(
file_name => $self->get_module_path,
class_name => $self->get_class_name,
use => [
'Modern::Perl', 'Moose',
'namespace::autoclean', 'Method::Signatures',
"Data::Printer alias => 'pdump'", 'Module::Load'
],
extends => ['MySQL::ORM'],
attribs => \@attr,
methods => \@methods,
overwrite => 1,
);
$self->trace('exit');
}
method get_class_name {
my @ns;
push @ns, $self->namespace if $self->namespace;
push @ns, $self->camelize( $self->_db_name );
return join( '::', @ns );
}
method get_module_path {
my @tmp;
push @tmp, $self->dir if $self->dir;
my $class_name = $self->get_class_name;
push @tmp, split( /::/, $class_name );
return sprintf( '%s.pm', File::Spec->catdir(@tmp) );
}
##############################################################################
# private methods
##############################################################################
method _get_build_table_body {
my $body = '
my $want_class = (caller(1))[3];
if ($want_class =~ /__ANON__/) {
my @a = split(/\s+/, $want_class);
$want_class = $a[1];
}
load $want_class;
return $want_class->new(dbh => $self->dbh, schema_name => $self->db_name, db => $self, __lite => $self->__lite );
';
return $body;
}
method _build_db_name {
return $self->schema->name;
}
1;
( run in 0.933 second using v1.01-cache-2.11-cpan-39bf76dae61 )