docs
[gitmo/Class-MOP.git] / lib / Class / MOP / Instance.pm
CommitLineData
24869f62 1
2package Class::MOP::Instance;
3
4use strict;
5use warnings;
6
9fa4d0b4 7use Scalar::Util 'weaken';
24869f62 8
9our $VERSION = '0.01';
10
11sub meta {
12 require Class::MOP::Class;
13 Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
14}
15
16sub new {
052c2a1a 17 my ($class, $meta, @attrs) = @_;
c57c8b10 18 my @slots = map { $_->slots } @attrs;
24869f62 19 bless {
fc3ddd1d 20 # NOTE:
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
29 # never tell <:)
49c93440 30 meta => $meta,
052c2a1a 31 slots => \@slots,
24869f62 32 } => $class;
33}
34
49c93440 35sub create_instance {
36 my $self = shift;
37 $self->bless_instance_structure({});
2d711cc8 38}
39
49c93440 40sub bless_instance_structure {
41 my ($self, $instance_structure) = @_;
42 bless $instance_structure, $self->{meta}->name;
2d711cc8 43}
44
45# operations on meta instance
46
eb49acde 47sub get_all_slots {
48 my $self = shift;
49c93440 49 return @{$self->{slots}};
839ea973 50}
51
2d711cc8 52# operations on created instances
53
839ea973 54sub get_slot_value {
2bab2be6 55 my ($self, $instance, $slot_name) = @_;
56 return $instance->{$slot_name};
839ea973 57}
58
2bab2be6 59sub set_slot_value {
60 my ($self, $instance, $slot_name, $value) = @_;
61 $instance->{$slot_name} = $value;
62}
63
2d711cc8 64sub initialize_slot {
49c93440 65 my ($self, $instance, $slot_name) = @_;
66 $instance->{$slot_name} = undef;
2d711cc8 67}
68
c174112e 69sub initialize_all_slots {
70 my ($self, $instance) = @_;
71 foreach my $slot_name ($self->get_all_slots) {
72 $self->initialize_slot($instance, $slot_name);
73 }
74}
75
49c93440 76sub is_slot_initialized {
77 my ($self, $instance, $slot_name, $value) = @_;
2d711cc8 78 exists $instance->{$slot_name} ? 1 : 0;
2bab2be6 79}
839ea973 80
24869f62 811;
82
83__END__
84
85=pod
86
87=head1 NAME
88
89Class::MOP::Instance - Instance Meta Object
90
91=head1 SYNOPSIS
92
9fa4d0b4 93 # for the most part, this protocol is internal
94 # and not for public usage, but this how one
95 # might use it
96
97 package Foo;
98
99 use strict;
100 use warnings;
101 use metaclass 'Class::MOP::Class' => (
102 ':instance_metaclass' => 'ArrayBasedStorage::Instance',
103 );
104
105 # now Foo->new produces blessed ARRAY ref based objects
106
24869f62 107=head1 DESCRIPTION
108
9fa4d0b4 109This is a sub-protocol which governs instance creation
110and access to the slots of the instance structure.
111
112This may seem like over-abstraction, but by abstracting
113this process into a sub-protocol we make it possible to
114easily switch the details of how an object's instance is
115stored with minimal impact. In most cases just subclassing
116this class will be all you need to do (occasionally it
117requires that you also subclass Class::MOP::Attribute if
118you require some kind of specific attribute initializations).
119
24869f62 120=head1 METHODS
121
122=over 4
123
9fa4d0b4 124=item B<new ($meta, @attrs)>
125
126Creates a new instance meta-object and gathers all the slots from
127the list of C<@attrs> given.
128
129=item B<meta>
130
131This will return a B<Class::MOP::Class> instance which is related
132to this class.
133
134=back
135
136=head2 Creation of Instances
137
138=over 4
24869f62 139
58287a97 140=item B<create_instance>
141
9fa4d0b4 142This creates the appropriate structure needed for the instance and
143then calls C<bless_instance_structure> to bless it into the class.
0e76a376 144
9fa4d0b4 145=item B<bless_instance_structure ($instance_structure)>
839ea973 146
9fa4d0b4 147This does just exactly what it says it does.
0e76a376 148
9fa4d0b4 149=back
839ea973 150
9fa4d0b4 151=head2 Instrospection
58287a97 152
9fa4d0b4 153NOTE: There might be more methods added to this part of the API,
154we will add then when we need them basically.
58287a97 155
9fa4d0b4 156=over 4
157
158=item B<get_all_slots>
159
160This will return the current list of slots based on what was
161given to this object in C<new>.
58287a97 162
24869f62 163=back
164
9fa4d0b4 165=head2 Operations on Instance Structures
166
167An important distinction of this sub-protocol is that the
168instance meta-object is a different entity from the actual
169instance it creates. For this reason, any actions on slots
170require that the C<$instance_structure> is passed into them.
24869f62 171
172=over 4
173
9fa4d0b4 174=item B<get_slot_value ($instance_structure, $slot_name)>
24869f62 175
9fa4d0b4 176=item B<set_slot_value ($instance_structure, $slot_name, $value)>
177
178=item B<initialize_slot ($instance_structure, $slot_name)>
179
180=item B<initialize_all_slots ($instance_structure)>
181
182=item B<is_slot_initialized ($instance_structure, $slot_name)>
24869f62 183
184=back
185
186=head1 AUTHOR
187
9fa4d0b4 188Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
189
24869f62 190Stevan Little E<lt>stevan@iinteractive.comE<gt>
191
192=head1 COPYRIGHT AND LICENSE
193
194Copyright 2006 by Infinity Interactive, Inc.
195
196L<http://www.iinteractive.com>
197
198This library is free software; you can redistribute it and/or modify
199it under the same terms as Perl itself.
200
84ef30d1 201=cut