use Scalar::Util 'blessed', 'reftype', 'weaken';
use Sub::Name 'subname';
-our $VERSION = '0.27';
+our $VERSION = '0.28';
our $AUTHORITY = 'cpan:STEVAN';
use base 'Class::MOP::Module';
# rebless!
$meta_instance->rebless_instance_structure($instance, $self);
- # check and upgrade all attributes
+ my %params;
+
foreach my $attr ( $self->compute_all_applicable_attributes ) {
if ( $attr->has_value($instance) ) {
- $attr->set_value($instance, $attr->get_value($instance) );
+ if ( defined( my $init_arg = $attr->init_arg ) ) {
+ $params{$init_arg} = $attr->get_value($instance);
+ } else {
+ $attr->set_value($instance);
+ }
}
}
+
+ foreach my $attr ($self->compute_all_applicable_attributes) {
+ $attr->initialize_instance_slot($meta_instance, $instance, \%params);
+ }
+}
+
+sub get_attribute_values {
+ my ($self, $instance) = @_;
+
+ return +{
+ map { $_->name => $_->get_value($instance) }
+ grep { $_->has_value($instance) }
+ $self->compute_all_applicable_attributes
+ };
+}
+
+sub get_init_args {
+ my ($self, $instance) = @_;
+
+ return +{
+ map { $_->init_arg => $_->get_value($instance) }
+ grep { $_->has_value($instance) }
+ grep { defined($_->init_arg) }
+ $self->compute_all_applicable_attributes
+ };
}
# Inheritance
think Yuval "nothingmuch" Kogman put it best when he said that cloning
is too I<context-specific> to be part of the MOP.
+=item B<get_attribute_values($instance)>
+
+Returns the values of the C<$instance>'s fields keyed by the attribute names.
+
+=item B<get_init_args($instance)>
+
+Returns a hash reference where the keys are all the attributes' C<init_arg>s
+and the values are the instance's fields. Attributes without an C<init_arg>
+will be skipped.
+
=item B<rebless_instance($instance)>
This will change the class of C<$instance> to the class of the invoking