Well,

You could do like what we did with MooseX::Storage, which exports a Storage function such that:

  with Storage(format => 'JSON', io => 'File');

is equivalent to:

with 'MooseX::Storage::Basic', 'MooseX::Storage::Format::JSON', 'MooseX::Storage::IO::File';

So you could export an 'opts' function which would do the role composition for you, such that ...

  opts qw(user password);

would be equivalent to:

  with 'My::App::User', 'My::App::Password';

as for if this would be useful for CPAN, I think if you generalized it enough, and added support for namespacing the user/password roles, etc. I suspect it would be helpful/useful. I am not sure about the MooseX::Common:: namespace though, it seems too general.

- Stevan

On Jun 23, 2008, at 2:39 AM, Christopher Brown wrote:

Stevan et al,

Sorry about that, I hit send by accident just before climbing on a plane ( returning from a week in Chicago for YAPC and other events ). Thanks for the quick reply.

I spend a good deal of churning out command-line and gui application based on Moose class. I find myself continually typing:

has 'user' => ...
has 'password' => ...
has 'tmp' => ...

How these get defined rarely ever changes. Nor do the tests for them change. I am trying to create a module which implements common attributes and sets up the framework for retrieving them from command line arguments, stdin, a event driven GUI interface, etc. It would be really nice to have the ability to say simply:

use Moose;
opts qw(user password );

Where user might refer to MooseX::Common::user.pm and password might refer to MooseX::Common::password.pm. Both user.pm and password.pm would define a Moose::Role that has a simple 'has' function that defines the full behavour of the common attribute. Opts is similar to the load_plugins function of Gillermo's MooseX::Object::Pluggable but allow for Class based loading of plugins rather than instance based. I plan on using this with MooseX::Getopt. And this where it get troublesome. When the MooseX::Getopt constructor, new_with_options is called, the options are retrieved. And I then cannot use the MooseX::Object::Pluggable instance based loading.

Some things that strike me as possible are:

1. Just keep it simple and use Moose::Roles. But then instead of a simple opt as described above, I have to say:
with qw( MooseX::Common::user MooseX::Common::password );
Not too bad, I suppose and barring any simple solutions for introducing opts, I will probably do this.

2. Use Moose Classes instead of roles, but I only have a vague notion of how this would work. Having heard the horizontal reuse talk at YAPC, this seems to go against the what seems like a perfect model for the horizontal reuse pattern.

One final question:
If I were to unlease this on CPAN ... any thoughts on whether it would be useful and what I should call it?

Thanks in Advance,

Chris




I also plan on extending these with MooseX::Getopt;

password might be are (to be) defined as Moose roles and gathered using MooseX::Getopt and loaded by a mechanism such as MooseX::Object::Pluggable.



On Sun, Jun 22, 2008 at 8:36 PM, Stevan Little <[EMAIL PROTECTED]> wrote:
Christopher,

Well it all depends on how you want to extend them, some ways are better then others.

To extend the whole of Moose, take a look at the section on Extending and Embedding Moose in the Moose.pm POD. It explains how you can wrap the Moose system and extend it for your needs.

To just extend the options that 'has' accepts, you can do that with custom attribute metaclasses or attribute traits (there are cookbooks on both of these).

Short of that I would need to know more what you want the syntax too look like to give you any better clues.

- Steva




On Jun 22, 2008, at 12:03 PM, Christopher Brown wrote:

Hi All,

Quick questions: Is it advisable to extend the core Moose keywords. ( I
think the answer is no).  But if so, what is the best way to do it.

Background:
I am trying to extend MooseX::Getopt to provide patterns for the standard
GNU Command Line Options


Reply via email to