package Mouse::Meta::Attribute;
use strict;
use warnings;
-require overload;
use Carp 'confess';
use Scalar::Util ();
$_[0]->{_create_args}
}
-sub inlined_name {
+sub _inlined_name {
my $self = shift;
- my $name = $self->name;
- my $key = "'" . $name . "'";
- return $key;
+ return sprintf '"%s"', quotemeta $self->name;
}
-sub generate_accessor_method_inline {
+sub _generate_accessor{
my ($attribute) = @_;
my $name = $attribute->name;
my $compiled_type_constraint = $constraint ? $constraint->{_compiled_type_constraint} : undef;
my $self = '$_[0]';
- my $key = $attribute->inlined_name;
+ my $key = $attribute->_inlined_name;
my $accessor =
'#line ' . __LINE__ . ' "' . __FILE__ . "\"\n" .
}
-sub generate_predicate {
+sub _generate_predicate {
my $attribute = shift;
- my $key = $attribute->inlined_name;
+ my $key = $attribute->_inlined_name;
my $predicate = 'sub { exists($_[0]->{'.$key.'}) }';
return $sub;
}
-sub generate_clearer {
+sub _generate_clearer {
my $attribute = shift;
- my $key = $attribute->inlined_name;
+ my $key = $attribute->_inlined_name;
my $clearer = 'sub { delete($_[0]->{'.$key.'}) }';
return $sub;
}
-sub generate_handles {
+sub _generate_handles {
my $attribute = shift;
my $reader = $attribute->name;
my %handles = $attribute->_canonicalize_handles($attribute->handles);
if exists $args{coerce};
if (exists $args{isa}) {
- confess "Got isa => $args{isa}, but Mouse does not yet support parameterized types for containers other than ArrayRef and HashRef (rt.cpan.org #39795)"
- if $args{isa} =~ /^([^\[]+)\[.+\]$/ &&
- $1 ne 'ArrayRef' &&
- $1 ne 'HashRef' &&
- $1 ne 'Maybe'
- ;
-
my $type_constraint = delete $args{isa};
$args{type_constraint}= Mouse::Util::TypeConstraints::find_or_create_isa_type_constraint($type_constraint);
}
$class->add_attribute($attribute);
+ my $associated_methods = 0;
+
+ my $is_metadata = $attribute->_is_metadata || '';
+
# install an accessor
- if ($attribute->_is_metadata eq 'rw' || $attribute->_is_metadata eq 'ro') {
- my $code = $attribute->generate_accessor_method_inline();
+ if ($is_metadata eq 'rw' || $is_metadata eq 'ro') {
+ my $code = $attribute->_generate_accessor();
$class->add_method($name => $code);
+ $associated_methods++;
}
for my $method (qw/predicate clearer/) {
my $predicate = "has_$method";
if ($attribute->$predicate) {
- my $generator = "generate_$method";
+ my $generator = "_generate_$method";
my $coderef = $attribute->$generator;
$class->add_method($attribute->$method => $coderef);
+ $associated_methods++;
}
}
if ($attribute->has_handles) {
- my $method_map = $attribute->generate_handles;
+ my $method_map = $attribute->_generate_handles;
for my $method_name (keys %$method_map) {
$class->add_method($method_name => $method_map->{$method_name});
+ $associated_methods++;
}
}
+ if($associated_methods == 0 && $is_metadata ne 'bare'){
+ Carp::cluck(qq{Attribute ($name) of class }.$class->name.qq{ has no associated methods (did you mean to provide an "is" argument?)});
+
+ }
+
return $attribute;
}
Informational methods.
-=head2 generate_accessor -> CODE
-
-Creates a new code reference for the attribute's accessor.
-
-=head2 generate_predicate -> CODE
-
-Creates a new code reference for the attribute's predicate.
-
-=head2 generate_clearer -> CODE
-
-Creates a new code reference for the attribute's clearer.
-
-=head2 generate_handles -> { MethodName => CODE }
-
-Creates a new code reference for each of the attribute's handles methods.
-
=head2 verify_against_type_constraint Item -> 1 | ERROR
Checks that the given value passes this attribute's type constraint. Returns 1