[Dbix-class] A DBIC based library

Iain iainhubbard at googlemail.com
Mon Jun 8 13:15:55 GMT 2009


On Sat, 2009-06-06 at 11:27 +0200, Zbigniew Lukasiak wrote:
> Hi,
> 
> I am trying to figure out how to package a DBIC Result as a library.
> You can find more background in my blog post:
> http://perlalchemy.blogspot.com/2009/06/packaging-cross-cutting-catalyst.html
> .   What I tried is simply defining that Result class in a separate
> package - and later subclassing it:
> 
> package CatalystX::Comments::DBICResult;
> 
> use strict;
> use warnings;
> 
> use base 'DBIx::Class';
> 
> __PACKAGE__->load_components(qw/TimeStamp PK::Auto Core/);
> __PACKAGE__->table('comment');
> __PACKAGE__->add_columns(
>   id =>  { data_type => 'integer', is_auto_increment => 1, is_nullable => 0 },
>   item_id  =>  { data_type => 'integer', is_nullable => 0 },
>   body => { data_type => 'text', default_value => undef, is_nullable => 1 },
>   nick => { data_type => 'varchar', default_value => undef, is_nullable => 1 },
>   email => { data_type => 'varchar', default_value => undef, is_nullable => 1 },
>   web_site => { data_type => 'varchar', default_value => undef,
> is_nullable => 1 },
>   ip => { data_type => 'varchar', default_value => undef, is_nullable => 1 },
>   t_created => { data_type => 'datetime', set_on_create => 1 },
>   t_updated => { data_type => 'datetime', set_on_create => 1,
> set_on_update => 1 },
> );
> __PACKAGE__->set_primary_key('id');
> 
> 1;
> 
> 
> And the subclass:
> 
> package PiraciDrogowi::DBSchema::Comment;
> 
> use strict;
> use warnings;
> 
> use base 'CatalystX::Comments::DBICResult';
> 
> __PACKAGE__->belongs_to('incydent',
> 'PiraciDrogowi::DBSchema::Incydent', { id => 'item_id' });
> 
> 1;
> 
> 
> Obviously that was rather naive approach - but it was the first I thought up.
> It nearly works:
> 
> 
> use lib 'lib';
> 
> use PiraciDrogowi::DBSchema;
> 
> my $schema = PiraciDrogowi::DBSchema->connect( 'dbi:SQLite:dbname=piraci.db' );
> my $rs = $schema->resultset('Comment');
> print $rs->count, "\n";
> my $comment = $rs->first;
> print $comment->incydent->id;
> 
> 
> This prints:
> 1
> Can't locate object method "incydent" via package
> "CatalystX::Comments::DBICResult" at a.pl line 9.
> 
> So it finds the record - but it does not see the relationships I added
> in the subclass.
> 

I too would be grateful for any advice on this. 

For example say bugzilla used DBIC and I wanted to write an extension.
How could I add extra methods to the row object without modifying the
existing result source.

Iain.




More information about the DBIx-Class mailing list