X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FInstance.pm;h=ea3d124ea5b429405154031098787814a3158d96;hb=69e3ab0a5a391925610bbb917d81da8d53fd1b91;hp=4f5621312f530015301ed3bd909b6cd1e0492fc9;hpb=495af5181ab3a346f2271c3b1a981e355941e2c4;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Instance.pm b/lib/Class/MOP/Instance.pm index 4f56213..ea3d124 100644 --- a/lib/Class/MOP/Instance.pm +++ b/lib/Class/MOP/Instance.pm @@ -6,32 +6,39 @@ use warnings; use Scalar::Util 'weaken', 'blessed'; -our $VERSION = '0.01'; +our $VERSION = '0.03'; +our $AUTHORITY = 'cpan:STEVAN'; -sub meta { +sub meta { require Class::MOP::Class; Class::MOP::Class->initialize(blessed($_[0]) || $_[0]); } -sub new { +sub new { my ($class, $meta, @attrs) = @_; my @slots = map { $_->slots } @attrs; - bless { + my $instance = bless { # NOTE: # I am not sure that it makes # sense to pass in the meta - # The ideal would be to just - # pass in the class name, but - # that is placing too much of - # an assumption on bless(), + # The ideal would be to just + # pass in the class name, but + # that is placing too much of + # an assumption on bless(), # which is *probably* a safe - # assumption,.. but you can + # assumption,.. but you can # never tell <:) - meta => $meta, - slots => { map { $_ => undef } @slots }, - } => $class; + '$!meta' => $meta, + '@!slots' => { map { $_ => undef } @slots }, + } => $class; + + weaken($instance->{'$!meta'}); + + return $instance; } +sub associated_metaclass { (shift)->{'$!meta'} } + sub create_instance { my $self = shift; $self->bless_instance_structure({}); @@ -39,7 +46,7 @@ sub create_instance { sub bless_instance_structure { my ($self, $instance_structure) = @_; - bless $instance_structure, $self->{meta}->name; + bless $instance_structure, $self->associated_metaclass->name; } sub clone_instance { @@ -51,19 +58,19 @@ sub clone_instance { sub get_all_slots { my $self = shift; - return keys %{$self->{slots}}; + return keys %{$self->{'@!slots'}}; } sub is_valid_slot { my ($self, $slot_name) = @_; - exists $self->{slots}->{$slot_name} ? 1 : 0; + exists $self->{'@!slots'}->{$slot_name} ? 1 : 0; } # operations on created instances sub get_slot_value { my ($self, $instance, $slot_name) = @_; - return $instance->{$slot_name}; + $self->is_slot_initialized($instance, $slot_name) ? $instance->{$slot_name} : undef; } sub set_slot_value { @@ -73,7 +80,12 @@ sub set_slot_value { sub initialize_slot { my ($self, $instance, $slot_name) = @_; - $self->set_slot_value($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,19 +95,26 @@ 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; } sub weaken_slot_value { - my ($self, $instance, $slot_name) = @_; - weaken $instance->{$slot_name}; + my ($self, $instance, $slot_name) = @_; + weaken $instance->{$slot_name}; } sub strengthen_slot_value { - my ($self, $instance, $slot_name) = @_; - $self->set_slot_value($instance, $slot_name, $self->get_slot_value($instance, $slot_name)); + my ($self, $instance, $slot_name) = @_; + $self->set_slot_value($instance, $slot_name, $self->get_slot_value($instance, $slot_name)); } # inlinable operation snippets @@ -114,12 +133,13 @@ sub inline_slot_access { sub inline_get_slot_value { my ($self, $instance, $slot_name) = @_; - $self->inline_slot_access($instance, $slot_name); + 'exists ' . $self->inline_slot_access($instance, $slot_name) . + ' ? ' . $self->inline_slot_access($instance, $slot_name) . ' : undef' } sub inline_set_slot_value { my ($self, $instance, $slot_name, $value) = @_; - $self->inline_slot_access($instance, $slot_name) . " = $value", + $self->inline_slot_access($instance, $slot_name) . " = $value", } sub inline_initialize_slot { @@ -127,6 +147,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"; @@ -148,37 +172,37 @@ __END__ =pod -=head1 NAME +=head1 NAME Class::MOP::Instance - Instance Meta Object =head1 SYNOPSIS - # for the most part, this protocol is internal - # and not for public usage, but this how one + # for the most part, this protocol is internal + # and not for public usage, but this how one # might use it - + package Foo; - + use strict; use warnings; use metaclass ( ':instance_metaclass' => 'ArrayBasedStorage::Instance', ); - + # now Foo->new produces blessed ARRAY ref based objects =head1 DESCRIPTION -This is a sub-protocol which governs instance creation +This is a sub-protocol which governs instance creation and access to the slots of the instance structure. -This may seem like over-abstraction, but by abstracting -this process into a sub-protocol we make it possible to -easily switch the details of how an object's instance is -stored with minimal impact. In most cases just subclassing -this class will be all you need to do (see the examples; -F and +This may seem like over-abstraction, but by abstracting +this process into a sub-protocol we make it possible to +easily switch the details of how an object's instance is +stored with minimal impact. In most cases just subclassing +this class will be all you need to do (see the examples; +F and F for details). =head1 METHODS @@ -187,12 +211,12 @@ F for details). =item B -Creates a new instance meta-object and gathers all the slots from +Creates a new instance meta-object and gathers all the slots from the list of C<@attrs> given. =item B -This will return a B instance which is related +This will return a B instance which is related to this class. =back @@ -203,7 +227,7 @@ to this class. =item B -This creates the appropriate structure needed for the instance and +This creates the appropriate structure needed for the instance and then calls C to bless it into the class. =item B @@ -216,14 +240,16 @@ This does just exactly what it says it does. =head2 Instrospection -NOTE: There might be more methods added to this part of the API, +NOTE: There might be more methods added to this part of the API, we will add then when we need them basically. =over 4 +=item B + =item B -This will return the current list of slots based on what was +This will return the current list of slots based on what was given to this object in C. =item B @@ -232,9 +258,9 @@ given to this object in C. =head2 Operations on Instance Structures -An important distinction of this sub-protocol is that the -instance meta-object is a different entity from the actual -instance it creates. For this reason, any actions on slots +An important distinction of this sub-protocol is that the +instance meta-object is a different entity from the actual +instance it creates. For this reason, any actions on slots require that the C<$instance_structure> is passed into them. =over 4 @@ -245,8 +271,12 @@ require that the C<$instance_structure> is passed into them. =item B +=item B + =item B +=item B + =item B =item B @@ -257,18 +287,18 @@ require that the C<$instance_structure> is passed into them. =head2 Inlineable Instance Operations -This part of the API is currently un-used. It is there for use -in future experiments in class finailization mostly. Best to +This part of the API is currently un-used. It is there for use +in future experiments in class finailization mostly. Best to ignore this for now. =over 4 =item B -Each meta-instance should override this method to tell Class::MOP if it's -possible to inline the slot access. +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 +This is currently only used by Class::MOP::Class::Immutable when performing optimizations. =item B @@ -281,6 +311,8 @@ optimizations. =item B +=item B + =item B =item B @@ -289,7 +321,7 @@ optimizations. =back -=head1 AUTHOR +=head1 AUTHORS Yuval Kogman Enothingmuch@woobling.comE @@ -297,12 +329,12 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006 by Infinity Interactive, Inc. +Copyright 2006-2008 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +it under the same terms as Perl itself. =cut