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/