From 19435a164724e1cc3dab3ff8c3cd42392eb67c20 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 23 Sep 2009 01:10:36 -0500 Subject: allow passing attribute initialization args to the with_traits function --- lib/MooseX/MethodTraits.pm | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/MooseX/MethodTraits.pm b/lib/MooseX/MethodTraits.pm index 29214c3..9644e45 100644 --- a/lib/MooseX/MethodTraits.pm +++ b/lib/MooseX/MethodTraits.pm @@ -21,7 +21,7 @@ sub _generate_method_creators { for my $sub (keys %$with_traits) { my $spec = $with_traits->{$sub}; my $traits = $spec->{traits} || []; - my $munge = $spec->{munge} || sub { shift, \@_ }; + my $munge = $spec->{munge} || sub { shift, {@_} }; my $code = sub { my $meta = shift; @@ -37,13 +37,21 @@ sub _generate_method_creators { cache => 1, ); - $meta->add_method( - $name => $method_metaclass->name->wrap( - $method, - name => $name, - package_name => $meta->name, - ) + my $method_meta = $method_metaclass->name->wrap( + $method, + name => $name, + package_name => $meta->name, ); + + $meta->add_method($name => $method_meta); + + return unless $args; + + for my $attr_name (map { $_->meta->get_attribute_list } @$traits) { + next unless exists $args->{$attr_name}; + my $attr = $method_meta->meta->find_attribute_by_name($attr_name); + $attr->set_value($method_meta, $args->{$attr_name}); + } }; $package_meta->add_package_symbol('&' . $sub => $code); } -- cgit v1.2.3-54-g00ecf