On Thu, Sep 25, 2008 at 12:08:31AM -0700, Christopher Brown wrote:
> For instance, I can use *has "+..."* to change the properties of
> attributes.  I can use *traits* to change the properties.  And I can use
> roles to make reusable attributes.  But there does not seem to handle
> generic attributes.  And rename_attribute (and other functions) seems like
> one allow generics and seems like missing functionality.

Er. rename_attributes as you described it is completely irrelevant to this
problem. You'd've done better to start with the -actual- problem, which I'll
speak to below.
 
> I am pretty tired of writing  attribute specifications.   All my attributes
> are essentially the same.  They are dates, they are filenames, they are
> strings, they are names, they are directories.  My perl programs are
> littered with *has* *=>* definitions.  That are often repeated.

Moose does already support

has [ qw(...) ] => (...);

as an alias for

has $_ => (...) for qw(...);

> The good
> programmer in me says that I should put these reusable codes in modules and
> release them on CPAN. My hopes is to put these common attributes into a
> Moose Role and use them with some construct like:
> 
> with Attributes( date,  name );
> 
> The catch is that the attributes, though providing the same functionality
> based on the Type, do not always have the same name.  I often want an API to
> have attributes with different names.  "Date" might be "begin_date" or
> "name" might be "last_name" for instance.

So what you want is for the method aliasing stuff that already exists in
roles to be extended so you can alias attributes on application as well?

Now -that- seems like a useful feature, though I don't think it's actually
what you want. Stevan, Dave, thoughts?

> But I much rather say something like
> 
>     with Attributes( infile => "file", outfile=> "file" )

This smells like either the above, or parameterised roles. However ... 
 
> I suppose one solution would be to create a module that returns the
> definition of the attribute rather than the attribute itself
> 
>     use MooseX::Common::Attributes;
>     my $mca = MooseX::Common::Attributes->new;
>     has qw(infile, outfile) => $mcs->file;
> 
> But that gets uglier.

Well, only because you intentionally made it ugly.

Instead, I think what you really want it one of

(1) export attribute declarators, so -

use MooseX::Attributes::File qw(has_file);

has_file 'infile';
has_file 'outfile';

(2) an attribute metaclass that provides what you want as defaults

has 'infile' => (metaclass => 'File');
has 'outfile' => (metaclass => 'File');

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/

Reply via email to