On Tue, Nov 10, 2009 at 6:09 PM, Markx.Allen <markx.al...@target.com> wrote: > I've read through almost all of the Moose docs I could find on CPAN and > several of the Moose slide decks floating around the Interwebs. > > That being said I have some basic questions that probably have simple > answers. Maybe I didn't read the fine manuals closely enough, so if I did > overlook something, please point me toward the right spot in the docs and > I'll figure it out. > > That being said here are my questions: > > 1) In the "old style" OO (which I have used for a long time now) I would do > something like this: > > I would make a file called "Account.pm" and try to encapsulate all of the > functionality of accounts in that one file. > > I would make another file called Server.pm and encapsulate functionality > around servers in the other file. Then if Account and Server have a > relationship, I would do this: > > package Account; > > use Server; > > I found that if I do this: > > package Server; # (in a file called Server.pm) > use Moose; > > has 'name' => { > is => 'ro', > isa => 'Str', > }; > > # etc > > package Account; # (in a file called Account.pm) > use Moose; > use Server; > > has 'server' => { > is => 'ro', > isa => 'Server', > }; > > perl -wc Account.pm throws an error > > but if I change "use" to "require Server;" I do not get an error. > > Why doesn't use work?
That does work, there are several examples on CPAN of where it *has* to work since that is shipped code. You'll need to provide more details about the error you're getting for help figuring out what is going on. > 2) Maybe I haven't really grokked the Moose Way yet, but what's the best way > to implement a collection of Moose Objects? > > In the old style OO, I would implement an object as, say, Account.pm and then > I would create a collection class of that object type called XXXCollection or > AccountCollection.pm in this case. I usually stored individual objects as a > hash of hashes, using the object name as the key. That would still work. The simplest possible solution is an ArrayRef or HashRef package Server; use Moose; has accounts => ( isa => 'ArraRef[Account]', is => 'ro', ...); # # then later Server->new( accounts => [Account->new( ...) ] ); The packages in the rather new Native Attributes code can help here. If you have a more specific question someone can help sort it out, but you're asking a very generic question so I can only provide a very generic answer. > I suspect that Roles and Traits can help me write a Collection class > trivially where I will get a lot of functionality "for free" but I'm just not > quite sure I understand the docs well enough to put it all together. Roles can provide a collection API if you want to go that route. A quick example would be something like: package MyApp::Collection::API; use Moose::Role; has accounts => ( isa => 'ArraRef[Object]', is => 'ro', traits => ['Array'] handles => { add_element => 'push', remove_element => 'pop' } ); package AccountCollection; use Moose; use MooseX::Aliases; with qw(MyApp::Collection::API); alias add_account => 'add_element'; alias rmove_account => 'remove_element'; But again It'd help to have specific questions if you want more specific answers :)