clear/deinitialize but with tests only for deinitialize
[gitmo/Class-MOP.git] / lib / Class / MOP / Instance.pm
index 66e1f45..d8bf313 100644 (file)
@@ -4,9 +4,9 @@ package Class::MOP::Instance;
 use strict;
 use warnings;
 
-use Scalar::Util 'weaken';
+use Scalar::Util 'weaken', 'blessed';
 
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 sub meta { 
     require Class::MOP::Class;
@@ -73,7 +73,12 @@ sub set_slot_value {
 
 sub initialize_slot {
     my ($self, $instance, $slot_name) = @_;
-    $instance->{$slot_name} = undef;
+    $self->set_slot_value($instance, $slot_name, undef);
+}
+
+sub deinitialize_slot {
+    my ( $self, $instance, $slot_name ) = @_;
+    delete $instance->{$slot_name};
 }
 
 sub initialize_all_slots {
@@ -83,6 +88,13 @@ sub initialize_all_slots {
     }
 }
 
+sub deinitialize_all_slots {
+    my ($self, $instance) = @_;
+    foreach my $slot_name ($self->get_all_slots) {
+        $self->deinitialize_slot($instance, $slot_name);
+    }
+}
+
 sub is_slot_initialized {
     my ($self, $instance, $slot_name, $value) = @_;
     exists $instance->{$slot_name} ? 1 : 0;
@@ -100,6 +112,13 @@ sub strengthen_slot_value {
 
 # inlinable operation snippets
 
+sub is_inlinable { 1 }
+
+sub inline_create_instance {
+    my ($self, $class_variable) = @_;
+    'bless {} => ' . $class_variable;
+}
+
 sub inline_slot_access {
     my ($self, $instance, $slot_name) = @_;
     sprintf "%s->{%s}", $instance, $slot_name;
@@ -120,6 +139,10 @@ sub inline_initialize_slot {
     $self->inline_set_slot_value($instance, $slot_name, 'undef'),
 }
 
+sub inline_deinitialize_slot {
+    my ($self, $instance, $slot_name) = @_;
+    "delete " . $self->inline_slot_access($instance, $slot_name);
+}
 sub inline_is_slot_initialized {
     my ($self, $instance, $slot_name) = @_;
     "exists " . $self->inline_slot_access($instance, $slot_name) . " ? 1 : 0";
@@ -238,8 +261,12 @@ require that the C<$instance_structure> is passed into them.
 
 =item B<initialize_slot ($instance_structure, $slot_name)>
 
+=item B<deinitialize_slot ($instance_structure, $slot_name)>
+
 =item B<initialize_all_slots ($instance_structure)>
 
+=item B<deinitialize_all_slots ($instance_structure)>
+
 =item B<is_slot_initialized ($instance_structure, $slot_name)>
 
 =item B<weaken_slot_value ($instance_structure, $slot_name)>
@@ -256,6 +283,16 @@ ignore this for now.
 
 =over 4
 
+=item B<is_inlinable>
+
+Each meta-instance should override this method to tell Class::MOP if it's 
+possible to inline the slot access. 
+
+This is currently only used by Class::MOP::Class::Immutable when performing 
+optimizations.
+
+=item B<inline_create_instance>
+
 =item B<inline_slot_access ($instance_structure, $slot_name)>
 
 =item B<inline_get_slot_value ($instance_structure, $slot_name)>
@@ -264,6 +301,8 @@ ignore this for now.
 
 =item B<inline_initialize_slot ($instance_structure, $slot_name)>
 
+=item B<inline_deinitialize_slot ($instance_structure, $slot_name)>
+
 =item B<inline_is_slot_initialized ($instance_structure, $slot_name)>
 
 =item B<inline_weaken_slot_value ($instance_structure, $slot_name)>
@@ -272,7 +311,7 @@ ignore this for now.
 
 =back
 
-=head1 AUTHOR
+=head1 AUTHORS
 
 Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>