use strict;
use warnings;
-our $VERSION = '1.05';
+our $VERSION = '1.14';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
sub _eval_code {
my ( $self, $source ) = @_;
- # NOTE:
- # set up the environment
- my $attr = $self->associated_attribute;
- my $type_constraint_obj = $attr->type_constraint;
- my $environment = {
- '$attr' => \$attr,
- '$meta' => \$self,
- '$type_constraint_obj' => \$type_constraint_obj,
- '$type_constraint' => \($type_constraint_obj
- ? $type_constraint_obj->_compiled_type_constraint
- : undef),
- };
+ my $environment = $self->_eval_environment;
- #warn "code for " . $attr->name . " =>\n" . $source . "\n";
my ( $code, $e ) = $self->_compile_code( environment => $environment, code => $source );
$self->throw_error(
return $code;
}
+sub _eval_environment {
+ my $self = shift;
+
+ my $attr = $self->associated_attribute;
+ my $type_constraint_obj = $attr->type_constraint;
+
+ return {
+ '$attr' => \$attr,
+ '$meta' => \$self,
+ '$type_constraint_obj' => \$type_constraint_obj,
+ '$type_constraint' => \(
+ $type_constraint_obj
+ ? $type_constraint_obj->_compiled_type_constraint
+ : undef
+ ),
+ };
+}
+
sub _generate_accessor_method_inline {
my $self = $_[0];
my $attr = $self->associated_attribute;
return $attr->should_coerce;
}
-sub _generate_reader_method { shift->_generate_reader_method_inline(@_) }
-sub _generate_writer_method { shift->_generate_writer_method_inline(@_) }
-sub _generate_accessor_method { shift->_generate_accessor_method_inline(@_) }
-sub _generate_predicate_method { shift->_generate_predicate_method_inline(@_) }
-sub _generate_clearer_method { shift->_generate_clearer_method_inline(@_) }
+sub _instance_is_inlinable {
+ my $self = shift;
+ return $self->associated_attribute->associated_class->instance_metaclass->is_inlinable;
+}
+
+sub _generate_reader_method {
+ my $self = shift;
+ $self->_instance_is_inlinable ? $self->_generate_reader_method_inline(@_)
+ : $self->SUPER::_generate_reader_method(@_);
+}
+
+sub _generate_writer_method {
+ my $self = shift;
+ $self->_instance_is_inlinable ? $self->_generate_writer_method_inline(@_)
+ : $self->SUPER::_generate_writer_method(@_);
+}
+
+sub _generate_accessor_method {
+ my $self = shift;
+ $self->_instance_is_inlinable ? $self->_generate_accessor_method_inline(@_)
+ : $self->SUPER::_generate_accessor_method(@_);
+}
+
+sub _generate_predicate_method {
+ my $self = shift;
+ $self->_instance_is_inlinable ? $self->_generate_predicate_method_inline(@_)
+ : $self->SUPER::_generate_predicate_method(@_);
+}
+
+sub _generate_clearer_method {
+ my $self = shift;
+ $self->_instance_is_inlinable ? $self->_generate_clearer_method_inline(@_)
+ : $self->SUPER::_generate_clearer_method(@_);
+}
sub _inline_pre_body { '' }
sub _inline_post_body { '' }
my $attr = $self->associated_attribute;
- return '' unless $attr->should_coerce;
+ return '' unless $attr->should_coerce && $attr->type_constraint->has_coercion;
return "$value = \$attr->type_constraint->coerce($value);";
}