stuff
[gitmo/Class-MOP.git] / examples / InsideOutClass.pod
CommitLineData
9ec169fe 1
9ec169fe 2
3package # hide the package from PAUSE
2d711cc8 4 InsideOutClass::Instance;
9ec169fe 5
6use strict;
7use warnings;
8
2bab2be6 9our $VERSION = '0.06';
9ec169fe 10
b9dfbf78 11use Carp 'confess';
9ec169fe 12use Scalar::Util 'refaddr';
13
2d711cc8 14use base 'Class::MOP::Instance';
15
16sub create_instance {
49c93440 17 my ($self, $class) = @_;
18 $self->bless_instance_structure(\(my $instance));
9ec169fe 19}
20
2d711cc8 21sub get_slot_value {
49c93440 22 my ($self, $instance, $slot_name) = @_;
23 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance};
9ec169fe 24}
25
2d711cc8 26sub set_slot_value {
49c93440 27 my ($self, $instance, $slot_name, $value) = @_;
28 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance} = $value;
9ec169fe 29}
30
49c93440 31sub initialize_slot {
32 my ($self, $instance, $slot_name) = @_;
5cc54af3 33 $self->{meta}->add_package_variable(('%' . $slot_name) => {});
49c93440 34 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance} = undef;
35}
2d711cc8 36
49c93440 37sub is_slot_initialized {
38 my ($self, $instance, $slot_name) = @_;
39 return 0 unless $self->{meta}->has_package_variable('%' . $slot_name);
40 return exists $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance} ? 1 : 0;
9ec169fe 41}
42
2d711cc8 43## &remove_slot is left as an exercise for the reader :)
9ec169fe 44
451;
46
47__END__
48
49=pod
50
51=head1 NAME
52
53InsideOutClass - A set of example metaclasses which implement the Inside-Out technique
54
55=head1 SYNOPSIS
56
57 package Foo;
58
fed4cee7 59 use metaclass 'Class::MOP::Class' => (
677eb158 60 # tell our metaclass to use the
61 # InsideOut attribute metclass
62 # to construct all it's attributes
2d711cc8 63 ':instance_metaclass' => 'InsideOutClass::Instance'
677eb158 64 );
9ec169fe 65
2e41896e 66 __PACKAGE__->meta->add_attribute('foo' => (
67 reader => 'get_foo',
68 writer => 'set_foo'
69 ));
9ec169fe 70
71 sub new {
72 my $class = shift;
5659d76e 73 $class->meta->new_object(@_);
74 }
9ec169fe 75
76 # now you can just use the class as normal
77
78=head1 DESCRIPTION
79
80This is a set of example metaclasses which implement the Inside-Out
81class technique. What follows is a brief explaination of the code
82found in this module.
83
2d711cc8 84We must create a subclass of B<Class::MOP::Instance> and override
85the slot operations. This requires
86overloading C<get_slot_value>, C<set_slot_value>, C<slot_initialized>, and
87C<initialize_slot>, as well as their inline counterparts. Additionally we
88overload C<add_slot> in order to initialize the global hash containing the
89actual slot values.
9ec169fe 90
91And that is pretty much all. Of course I am ignoring need for
92inside-out objects to be C<DESTROY>-ed, and some other details as
2d711cc8 93well (threading, etc), but this is an example. A real implementation is left as
94an exercise to the reader.
9ec169fe 95
96=head1 AUTHOR
97
98Stevan Little E<lt>stevan@iinteractive.comE<gt>
99
2d711cc8 100=head1 SEE ALSO
101
102L<Tie::RefHash::Weak>
103
9ec169fe 104=head1 COPYRIGHT AND LICENSE
105
106Copyright 2006 by Infinity Interactive, Inc.
107
108L<http://www.iinteractive.com>
109
110This library is free software; you can redistribute it and/or modify
111it under the same terms as Perl itself.
112
113=cut