use strict;
use warnings;
-our $VERSION = '1.02';
+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);";
}
}
sub _inline_store {
- my ($self, $instance, $value) = @_;
- my $attr = $self->associated_attribute;
+ my ( $self, $instance, $value ) = @_;
- my $mi = $attr->associated_class->get_meta_instance;
-
- my $code = $mi->inline_set_slot_value($instance, $attr->slots, $value) . ";";
- $code .= $mi->inline_weaken_slot_value($instance, $attr->slots, $value) . ";"
- if $attr->is_weak_ref;
- return $code;
+ return $self->associated_attribute->inline_store( $instance, $value );
}
sub _inline_get_old_value_for_trigger {
my $attr = $self->associated_attribute;
return '' unless $attr->has_trigger;
- my $mi = $attr->associated_class->get_meta_instance;
- my $pred = $mi->inline_is_slot_initialized($instance, $attr->name);
-
return
'my @old = '
- . $pred . q{ ? }
+ . $self->_inline_has($instance) . q{ ? }
. $self->_inline_get($instance) . q{ : ()} . ";\n";
}
sub _inline_get {
my ($self, $instance) = @_;
- my $attr = $self->associated_attribute;
-
- my $mi = $attr->associated_class->get_meta_instance;
- return $mi->inline_get_slot_value($instance, $attr->slots);
+ return $self->associated_attribute->inline_get($instance);
}
sub _inline_access {
my ($self, $instance) = @_;
- my $attr = $self->associated_attribute;
-
- my $mi = $attr->associated_class->get_meta_instance;
- return $mi->inline_slot_access($instance, $attr->slots);
+ return $self->associated_attribute->inline_access($instance);
}
sub _inline_has {
my ($self, $instance) = @_;
- my $attr = $self->associated_attribute;
-
- my $mi = $attr->associated_class->get_meta_instance;
- return $mi->inline_is_slot_initialized($instance, $attr->slots);
+ return $self->associated_attribute->inline_has($instance);
}
sub _inline_auto_deref {