my $params = @_ == 1 ? $_[0] : {@_};
my $object = $self->SUPER::new_object($params);
- foreach my $attr ( $self->get_all_attributes() ) {
+ $self->call_all_triggers($object, $params);
+
+ $object->BUILDALL($params) if $object->can('BUILDALL');
+
+ return $object;
+}
+
+sub call_all_triggers {
+ my ($self, $object, $params) = @_;
+
+ foreach my $attr ($self->get_all_attributes()) {
next unless $attr->can('has_trigger') && $attr->has_trigger;
my $init_arg = $attr->init_arg;
-
next unless defined $init_arg;
-
next unless exists $params->{$init_arg};
$attr->trigger->(
),
);
}
-
- $object->BUILDALL($params) if $object->can('BUILDALL');
-
- return $object;
}
sub _generate_fallback_constructor {
);
}
+
+sub _fixup_attributes_after_rebless {
+ my $self = shift;
+ my ($instance, $rebless_from, %params) = @_;
+
+ $self->SUPER::_fixup_attributes_after_rebless($instance, $rebless_from, %params);
+
+ $self->call_all_triggers($instance, \%params);
+}
+
+
+
## -------------------------------------------------
our $error_level;
initializer => sub {
my ($self, $value, $set, $attr) = @_;
$initializer_calls{new_attr}++;
+ $set->($value);
},
);
}
like( exception { $foo->type_constrained(10.5) }, qr/^Attribute \(type_constrained\) does not pass the type constraint because\: Validation failed for 'Int' with value 10\.5/, '... this failed because of type check' );
- TODO: {
- local $TODO = 'Moose::Meta::Class does not yet call triggers for rebless_instance!';
is_deeply(\%Child::trigger_calls, { new_attr => 1 }, 'Trigger fired on rebless_instance');
- }
is_deeply(\%Child::initializer_calls, { new_attr => 1 }, 'Initializer fired on rebless_instance');
undef %Child::trigger_calls;