Re: MooseX::Setter, request for feedback before pushing to CPAN.

[email protected] (benh)
Newsgroups perl.moose
Message-ID <[email protected]>
mst, I agree completely, I'll change things up to reflect your code.
Thanks again for the insight.

On Sat, Aug 2, 2008 at 1:23 PM, Matt S Trout <[email protected]> wrote:
> On Thu, Jul 31, 2008 at 07:38:31PM -0700, benh wrote:
>> So this was born from a conversation on IRC the other day about why
>> setting an attribute returns the value that you just set to. I've been
>> running with a "built in the wrong place" internal version of this but
>> figured that others might find it useful. So I'm looking for some
>> feedback before I toss it up on CPAN.
>>
>> Tests do a better job explaining:
>> http://www.develonizer.com/svn/MooseX-Setter/trunk/t/00-works.t
>>
>> Code is here:
>> http://www.develonizer.com/svn/MooseX-Setter/trunk/
>
> http://www.develonizer.com/svn/MooseX-MutatorAttributes/trunk/lib/MooseX/MutatorAttributes.pm
>
> Erm. That's -really- broken.
>
> $self->meta->{'%!attributes'}->{$attr}
>
> (1) You mustn't go groveling in the metaclass like that. Find the appropriate
> method and call it.
>
> (2) that's only going to work for attributes defined directly on the class.
>
> I suspect you wanted find_attribute_by_name.
>
> $self->$attr( $opts{$attr} );
>
> That's gonna break when that's not what the setter's called - you need to
> ask the attribute method object using get_write_method.
>
> For serious elegance, consider exporting a $set_multi variable instead -
> then instead of having to mangle every class you can do something like
>
> use MooseX::SetMulti;
>
> $obj->$set_multi(...)->...
>
> I think what you want is something like
>
> $set_multi = method (%attrs) {
>  my $meta = $self->meta;
>  while (my ($name, $value) = each %attrs) {
>    my $attr = $meta->find_attribute_by_name($name);
>    confess "No such attribute ${name} for ${self}" unless $attr;
>    my $setter = $attrs->get_write_method;
>    confess "No setter for attribute ${name} of ${self}" unless $attr;
>    $self->$setter($value);
>  }
>  $self;
> };
>
> --
>      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/
>



-- 
benh~

http://three.sentenc.es/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.