How to use Class:DBI with own constructors or OO-systems like Moo(se)?

77 Views Asked by At

When using Class::DBI in Perl, the insert() method from Class::DBI acts as a constructor returning an object. How can I use Class::DBI in combination with object attributes that are not part of any database tables?

For example: I would like to have my Music::Artist class to have a version attribute that is part of the resulting objects (so that I can use this object attribute in my overall application logic), but does not get written to the database?

Ultimately I would like to be able to combine the usage of Class::DBI with OO-systems like Moo(se).

Vanilla Class:DBI example code from metacpan:

package Music::DBI;
use base 'Class::DBI';
Music::DBI->connection('dbi:mysql:dbname', 'username', 'password');

package Music::Artist;
use base 'Music::DBI';
Music::Artist->table('artist');
Music::Artist->columns(All => qw/artistid name/);


#-- Meanwhile, in a nearby piece of code! --#

my $artist = Music::Artist->insert({ artistid => 1, name => 'U2' });

Pseude-code of what I would like to do:

package Music::Artist;
use base 'Music::DBI';
use Moo;

Music::DBI->connection('dbi:mysql:dbname', 'username', 'password');
Music::Artist->table('artist');
Music::Artist->columns(All => qw/artistid name/);

has name => ( is => 'rw' );
has version => ( is => 'rw' );


#-- Meanwhile, in a nearby piece of code! --#

my $artist = Music::Artist->new( name => 'U2', version => '0.1.0' );

$artist = Music::Artist->insert({ artistid => 1, name => $artist->name });

# ... do something with $artist->version ...

(Although this code could run, Class::DBI's insert() of cause overrides the object returned by Moo's new() in the first place.)

How to combine Class::DBI with own or third-party (Moo) constructors?

I read Class::DBIs documentation but did not find any information on how to override insert() as an approach to supply a combined constructor method. I also tried to find repositories on GitHub that make use of Class::DBI and own constructors or OO-systems in the same packages, but did not succeed either.

0

There are 0 best solutions below