DBIx-EAV
view release on metacpan or search on metacpan
lib/DBIx/EAV.pm view on Meta::CPAN
package DBIx::EAV;
use Moo;
use strictures 2;
use DBI;
use Lingua::EN::Inflect ();
use Data::Dumper;
use Digest::MD5 qw/ md5_hex /;
use DBIx::EAV::EntityType;
use DBIx::EAV::Entity;
use DBIx::EAV::ResultSet;
use DBIx::EAV::Schema;
use Carp qw' croak confess ';
use Scalar::Util 'blessed';
use Class::Load qw' try_load_class ';
use namespace::clean;
our $VERSION = "0.11";
# required
has 'dbh', is => 'ro', required => 1;
# options
has 'default_attribute_type', is => 'ro', default => 'varchar';
has 'schema_config', is => 'ro', default => sub { {} };
has 'entity_namespaces', is => 'ro', default => sub { [] };
has 'resultset_namespaces', is => 'ro', default => sub { [] };
# internal
has 'schema', is => 'ro', lazy => 1, builder => 1, init_arg => undef, handles => [qw/ table dbh_do /];
has '_type_declarations', is => 'ro', default => sub { {} };
has '_types', is => 'ro', default => sub { {} };
has '_types_by_id', is => 'ro', default => sub { {} };
# group schema_config params
around BUILDARGS => sub {
my ( $orig, $class, @args ) = @_;
my $params = @args == 1 && ref $args[0] ? $args[0] : { @args };
my $schema_config = delete $params->{schema_config} || {};
my @schema_params = grep { exists $params->{$_} } qw/
tenant_id data_types database_cascade_delete static_attributes
table_prefix id_type default_attribute_type enable_multi_tenancy
/;
@{$schema_config}{@schema_params} = delete @{$params}{@schema_params};
$class->$orig(%$params, schema_config => $schema_config);
};
sub _build_schema {
my $self = shift;
DBIx::EAV::Schema->new(%{$self->schema_config}, dbh => $self->dbh);
}
sub connect {
my ($class, $dsn, $user, $pass, $attrs, $constructor_params) = @_;
croak 'Missing $dsn argument for connect()' unless $dsn;
croak "connect() must be called as a class method."
if ref $class;
$constructor_params //= {};
$constructor_params->{dbh} = DBI->connect($dsn, $user, $pass, $attrs)
or die $DBI::errstr;
$class->new($constructor_params);
}
sub type {
my ($self, $name) = @_;
confess 'usage: eav->type($name)' unless $name;
return $self->_types->{$name}
if exists $self->_types->{$name};
my $type = $self->_load_or_register_type('name', $name);
confess "EntityType '$name' does not exist."
unless $type;
$type;
}
sub type_by_id {
my ($self, $value) = @_;
return $self->_types_by_id->{$value}
if exists $self->_types_by_id->{$value};
$self->_load_or_register_type('id', $value)
or confess "EntityType 'id=$value' does not exist.";
}
sub declare_entities {
my ($self, $schema) = @_;
my $declarations = $self->_type_declarations;
local $Data::Dumper::Indent = 0;
( run in 2.851 seconds using v1.01-cache-2.11-cpan-56fb94df46f )