yuval-wins
[gitmo/Class-MOP.git] / examples / ArrayBasedStorage.pod
CommitLineData
43715282 1
62189f84 2package # hide the package from PAUSE
f892c0f0 3 ArrayBasedStorage::Instance;
0e76a376 4
5use strict;
6use warnings;
7
8use Carp 'confess';
9
10our $VERSION = '0.01';
11
12use base 'Class::MOP::Instance';
13
14sub new {
15 my ($class, $meta, @attrs) = @_;
16 my $self = $class->SUPER::new($meta, @attrs);
17 my $index = 0;
18 $self->{slot_index_map} = { map { $_ => $index++ } $self->get_all_slots };
19 return $self;
20}
21
22sub create_instance {
23 my $self = shift;
24 $self->bless_instance_structure([]);
25}
26
27# operations on meta instance
28
62189f84 29sub get_slot_index_map { (shift)->{slot_index_map} }
30
0e76a376 31sub get_all_slots {
32 my $self = shift;
33 return sort @{$self->{slots}};
34}
35
36sub get_slot_value {
37 my ($self, $instance, $slot_name) = @_;
38 return $instance->[ $self->{slot_index_map}->{$slot_name} ];
39}
40
41sub set_slot_value {
42 my ($self, $instance, $slot_name, $value) = @_;
43 $instance->[ $self->{slot_index_map}->{$slot_name} ] = $value;
44}
45
46sub initialize_slot {
47 my ($self, $instance, $slot_name) = @_;
48 $instance->[ $self->{slot_index_map}->{$slot_name} ] = undef;
49}
50
51sub is_slot_initialized {
52 # NOTE:
53 # maybe use CLOS's *special-unbound-value*
54 # for this ?
55 confess "Cannot really tell this for sure";
56}
57
581;
59
60__END__
61
62=pod
63
64=head1 NAME
65
f892c0f0 66ArrayBasedStorage - An example of an Array based instance storage
0e76a376 67
68=head1 SYNOPSIS
69
f892c0f0 70 package Foo;
71
1becdfcc 72 use metaclass (
f892c0f0 73 ':instance_metaclass' => 'ArrayBasedStorage::Instance'
74 );
75
76 __PACKAGE__->meta->add_attribute('foo' => (
77 reader => 'get_foo',
78 writer => 'set_foo'
79 ));
80
81 sub new {
82 my $class = shift;
83 $class->meta->new_object(@_);
84 }
85
86 # now you can just use the class as normal
87
0e76a376 88=head1 DESCRIPTION
89
f892c0f0 90This is a proof of concept using the Instance sub-protocol
91which uses ARRAY refs to store the instance data.
92
1becdfcc 93This is very similar now to the InsideOutClass example, and
94in fact, they both share the exact same test suite, with
95the only difference being the Instance metaclass they use.
96
0e76a376 97=head1 AUTHOR
98
99Stevan Little E<lt>stevan@iinteractive.comE<gt>
100
101=head1 SEE ALSO
102
103=head1 COPYRIGHT AND LICENSE
104
105Copyright 2006 by Infinity Interactive, Inc.
106
107L<http://www.iinteractive.com>
108
109This library is free software; you can redistribute it and/or modify
110it under the same terms as Perl itself.
111
112=cut