2 package Class::MOP::Instance;
7 use Scalar::Util 'weaken';
12 require Class::MOP::Class;
13 Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
17 my ($class, $meta, @attrs) = @_;
18 my @slots = map { $_->slots } @attrs;
21 # I am not sure that it makes
22 # sense to pass in the meta
23 # The ideal would be to just
24 # pass in the class name, but
25 # that is placing too much of
26 # an assumption on bless(),
27 # which is *probably* a safe
28 # assumption,.. but you can
37 $self->bless_instance_structure({});
40 sub bless_instance_structure {
41 my ($self, $instance_structure) = @_;
42 bless $instance_structure, $self->{meta}->name;
45 # operations on meta instance
49 return @{$self->{slots}};
52 # operations on created instances
55 my ($self, $instance, $slot_name) = @_;
56 return $instance->{$slot_name};
60 my ($self, $instance, $slot_name, $value) = @_;
61 $instance->{$slot_name} = $value;
65 my ($self, $instance, $slot_name) = @_;
66 $instance->{$slot_name} = undef;
69 sub initialize_all_slots {
70 my ($self, $instance) = @_;
71 foreach my $slot_name ($self->get_all_slots) {
72 $self->initialize_slot($instance, $slot_name);
76 sub is_slot_initialized {
77 my ($self, $instance, $slot_name, $value) = @_;
78 exists $instance->{$slot_name} ? 1 : 0;
89 Class::MOP::Instance - Instance Meta Object
93 # for the most part, this protocol is internal
94 # and not for public usage, but this how one
101 use metaclass 'Class::MOP::Class' => (
102 ':instance_metaclass' => 'ArrayBasedStorage::Instance',
105 # now Foo->new produces blessed ARRAY ref based objects
109 This is a sub-protocol which governs instance creation
110 and access to the slots of the instance structure.
112 This may seem like over-abstraction, but by abstracting
113 this process into a sub-protocol we make it possible to
114 easily switch the details of how an object's instance is
115 stored with minimal impact. In most cases just subclassing
116 this class will be all you need to do (occasionally it
117 requires that you also subclass Class::MOP::Attribute if
118 you require some kind of specific attribute initializations).
124 =item B<new ($meta, @attrs)>
126 Creates a new instance meta-object and gathers all the slots from
127 the list of C<@attrs> given.
131 This will return a B<Class::MOP::Class> instance which is related
136 =head2 Creation of Instances
140 =item B<create_instance>
142 This creates the appropriate structure needed for the instance and
143 then calls C<bless_instance_structure> to bless it into the class.
145 =item B<bless_instance_structure ($instance_structure)>
147 This does just exactly what it says it does.
151 =head2 Instrospection
153 NOTE: There might be more methods added to this part of the API,
154 we will add then when we need them basically.
158 =item B<get_all_slots>
160 This will return the current list of slots based on what was
161 given to this object in C<new>.
165 =head2 Operations on Instance Structures
167 An important distinction of this sub-protocol is that the
168 instance meta-object is a different entity from the actual
169 instance it creates. For this reason, any actions on slots
170 require that the C<$instance_structure> is passed into them.
174 =item B<get_slot_value ($instance_structure, $slot_name)>
176 =item B<set_slot_value ($instance_structure, $slot_name, $value)>
178 =item B<initialize_slot ($instance_structure, $slot_name)>
180 =item B<initialize_all_slots ($instance_structure)>
182 =item B<is_slot_initialized ($instance_structure, $slot_name)>
188 Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
190 Stevan Little E<lt>stevan@iinteractive.comE<gt>
192 =head1 COPYRIGHT AND LICENSE
194 Copyright 2006 by Infinity Interactive, Inc.
196 L<http://www.iinteractive.com>
198 This library is free software; you can redistribute it and/or modify
199 it under the same terms as Perl itself.