X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FAttribute.pm;h=1e60e214abd27bb2226aaaa68cb234dcf772f5bd;hb=446d2d2c808c8d85b8845659755ec6078dcd7ea9;hp=4bb18566a2fc596455b95abe59d2a93cab7357a0;hpb=1f2b47800eef4a10a8a914b4663ae9af699c7f72;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Attribute.pm b/lib/Mouse/Attribute.pm index 4bb1856..1e60e21 100644 --- a/lib/Mouse/Attribute.pm +++ b/lib/Mouse/Attribute.pm @@ -18,16 +18,19 @@ sub new { sub name { $_[0]->{name} } sub class { $_[0]->{class} } +sub _is_metadata { $_[0]->{is} } +sub is_required { $_[0]->{required} } sub default { $_[0]->{default} } +sub is_lazy { $_[0]->{lazy} } sub predicate { $_[0]->{predicate} } sub clearer { $_[0]->{clearer} } sub handles { $_[0]->{handles} } sub weak_ref { $_[0]->{weak_ref} } sub init_arg { $_[0]->{init_arg} } sub type_constraint { $_[0]->{type_constraint} } +sub trigger { $_[0]->{trigger} } +sub builder { $_[0]->{builder} } -sub has_name { exists $_[0]->{name} } -sub has_class { exists $_[0]->{class} } sub has_default { exists $_[0]->{default} } sub has_predicate { exists $_[0]->{predicate} } sub has_clearer { exists $_[0]->{clearer} } @@ -35,21 +38,23 @@ sub has_handles { exists $_[0]->{handles} } sub has_weak_ref { exists $_[0]->{weak_ref} } sub has_init_arg { exists $_[0]->{init_arg} } sub has_type_constraint { exists $_[0]->{type_constraint} } +sub has_trigger { exists $_[0]->{trigger} } +sub has_builder { exists $_[0]->{builder} } sub generate_accessor { my $attribute = shift; - my $name = $attribute->{name}; - my $key = $attribute->{init_arg}; - my $default = $attribute->{default}; - my $trigger = $attribute->{trigger}; - my $type = $attribute->{type_constraint}; + my $name = $attribute->name; + my $key = $attribute->init_arg; + my $default = $attribute->default; + my $trigger = $attribute->trigger; + my $type = $attribute->type_constraint; my $constraint = $attribute->find_type_constraint; my $accessor = 'sub { my $self = shift;'; - if ($attribute->{is} eq 'rw') { + if ($attribute->_is_metadata eq 'rw') { $accessor .= 'if (@_) { local $_ = $_[0];'; @@ -62,7 +67,7 @@ sub generate_accessor { $accessor .= '$self->{$key} = $_;'; - if ($attribute->{weak_ref}) { + if ($attribute->weak_ref) { $accessor .= 'Scalar::Util::weaken($self->{$key});'; } @@ -75,9 +80,9 @@ sub generate_accessor { else { } - if ($attribute->{lazy}) { + if ($attribute->is_lazy) { $accessor .= '$self->{$key} = '; - $accessor .= ref($attribute->{default}) eq 'CODE' + $accessor .= ref($default) eq 'CODE' ? '$default->($self)' : '$default'; $accessor .= ' if !exists($self->{$key});'; @@ -91,7 +96,7 @@ sub generate_accessor { sub generate_predicate { my $attribute = shift; - my $key = $attribute->{init_arg}; + my $key = $attribute->init_arg; my $predicate = 'sub { exists($_[0]->{$key}) }'; @@ -100,7 +105,7 @@ sub generate_predicate { sub generate_clearer { my $attribute = shift; - my $key = $attribute->{init_arg}; + my $key = $attribute->init_arg; my $predicate = 'sub { delete($_[0]->{$key}) }'; @@ -109,12 +114,12 @@ sub generate_clearer { sub generate_handles { my $attribute = shift; - my $reader = $attribute->{name}; + my $reader = $attribute->name; my %method_map; - for my $local_method (keys %{ $attribute->{handles} }) { - my $remote_method = $attribute->{handles}{$local_method}; + for my $local_method (keys %{ $attribute->handles }) { + my $remote_method = $attribute->handles->{$local_method}; my $method = 'sub { my $self = shift; @@ -156,22 +161,23 @@ sub create { $meta->add_attribute($attribute); # install an accessor - if ($attribute->{is} eq 'rw' || $attribute->{is} eq 'ro') { + if ($attribute->_is_metadata eq 'rw' || $attribute->_is_metadata eq 'ro') { my $accessor = $attribute->generate_accessor; no strict 'refs'; *{ $class . '::' . $name } = $accessor; } for my $method (qw/predicate clearer/) { - if (exists $attribute->{$method}) { + my $predicate = "has_$method"; + if ($attribute->$predicate) { my $generator = "generate_$method"; my $coderef = $attribute->$generator; no strict 'refs'; - *{ $class . '::' . $attribute->{$method} } = $coderef; + *{ $class . '::' . $attribute->$method } = $coderef; } } - if ($attribute->{handles}) { + if ($attribute->has_handles) { my $method_map = $attribute->generate_handles; for my $method_name (keys %$method_map) { no strict 'refs';