[Dbix-class] How to inject more then one ResultSetClass in one ResultSet?

Jonas Alves jonas.alves at gmail.com
Wed Oct 31 11:33:12 GMT 2007


On 31/10/2007, Matt S Trout <dbix-class at trout.me.uk> wrote:
> On Tue, Oct 30, 2007 at 03:15:03PM +0000, Jonas Alves wrote:
> > On 30/10/2007, Jonathan Rockway <jon at jrock.us> wrote:
> > > Jonas Alves wrote:
> > > > Hi,
> > > >
> > > > I want my dbic components to be able to extend the ResultSet by adding
> > > > base classes when they are loaded.
> > >
> > > How about:
> > >
> > >    package MyApp::ResultSet::FooAndBar
> > >    use base qw/MyApp::ResultSet::Foo MyApp::ResultSet::Bar/;
> > >    1;
> > >
> > > If you want something more dynamic:
> > >
> > >    package MyApp::RS::Base;
> > >    use Moose;
> > >    extends 'DBIx::Class::ResultSet';
> > >    1;
> > >
> > >    package MyApp::RS::Role::Foo;
> > >    use Moose::Role;
> > >    sub foo { }
> > >    1;
> > >
> > >    <same idea for bar>
> > >
> > > Then you can say:
> > >
> > >    __PACKAGE__->resultset_class('MyApp::RS::Base');
> > >    __PACKAGE__->resultset_class->meta->apply_role('MyApp::RS::Role::Foo');
> > >
> > > Have I tested any of this?  No.  YMMV.
> > >
> > > (Dynamically building classes at runtime is probably a Bad Idea anyway.
> > > I suggest just going with the inheritance method shown first; just
> > > create a separate RS class for each case where you need one.)
> > >
> > > Regards,
> > > Jonathan Rockway
> > >
> >
> > Hi Jonathan,
> > I really like your Moose approach, but i would like  a solution that
> > just require the user to load_component my  extensions and with that
> > get the ResultSet methods for free.
>
> I think the idea of his approach was your common class would generate the
> resultset_class invocation.
>
> That's exactly how resultset plugins are going to work once DBIC goes
> Moose.
>

Yes, I understood. :) But DBIx::Class::ResultSet doesn't use Moose
yet, and I don't control the schemas where my extensions will be used.
They might have user defined ResultSets already set and I can't simply
discard them. I can however distribute a ResultSet base class like the
one Jonathan suggests, then at runtime I can inject that base class in
the user defined ResultSets  and after that apply my roles to it. Is
this a better approach?

Thanks a lot
-- 
Jonas



More information about the DBIx-Class mailing list