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