Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Assuming an application has the following dirctory structure.
Myapp/ bar/ bar.pm bar1.pm bar2.pm huh.pl
Where bar.pm is a Class::DBI base class.
My question is how do I set up the module naming. By that I mean;

# in bar/bar1.pm package bar::bar1; use base 'bar'; __PACKAGE__->has_many(barf => 'bar2'); 1; # in bar/bar2.pm package bar2; use base 'bar'; 1; # in bar/bar.pm package bar; use base 'Class::DBI'; use bar::bar1; use bar::bar2; 1; # in huh.pl #! /usr/bin/perl -w use strict; use bar::bar; # yeilds %perl huh.pl Can't locate object method "meta_info" via package "bar2" at /usr/lib/ +perl5/site_perl/5.8.0/Class/DBI/Relationship/HasMany.pm line 28. Compilation failed in require at bar/bar.pm line 3. BEGIN failed--compilation aborted at bar/bar.pm line 3. Compilation failed in require at huh.pl line 5. BEGIN failed--compilation aborted at huh.pl line 5.
Obviously I've left out some C::DBI stuff but the has_many seems to confuse my inheratence, what is the right way to do this?

Replies are listed 'Best First'.
Re: package structure
by rhesa (Vicar) on Feb 24, 2006 at 21:07 UTC
    First of all, you need to be consistent in which directory level you use as the base package name. I see you have bar::bar1, but also a plain bar, even though they're located in the same directory. In other words, your bar package ought to read like this:
    package bar::bar; use base 'Class::DBI'; 1;
    For the relationships, you're supposed to use the full package name, so
    __PACKAGE__->has_many(barf => 'bar::bar2');
    I don't think you're actually supposed to use() your subclasses inside your base class either.