3 package # hide the package from PAUSE
4 InsideOutClass::Instance;
12 use Scalar::Util 'refaddr';
14 use base 'Class::MOP::Instance';
17 my ($self, $class) = @_;
18 $self->bless_instance_structure(\(my $instance));
22 my ($self, $instance, $slot_name) = @_;
23 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance};
27 my ($self, $instance, $slot_name, $value) = @_;
28 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance} = $value;
32 my ($self, $instance, $slot_name) = @_;
33 $self->{meta}->add_package_variable('%' . $slot_name);
34 $self->{meta}->get_package_variable('%' . $slot_name)->{refaddr $instance} = undef;
37 sub 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;
43 ## &remove_slot is left as an exercise for the reader :)
53 InsideOutClass - A set of example metaclasses which implement the Inside-Out technique
59 use metaclass 'Class::MOP::Class' => (
60 # tell our metaclass to use the
61 # InsideOut attribute metclass
62 # to construct all it's attributes
63 ':instance_metaclass' => 'InsideOutClass::Instance'
66 __PACKAGE__->meta->add_attribute('foo' => (
73 $class->meta->new_object(@_);
76 # now you can just use the class as normal
80 This is a set of example metaclasses which implement the Inside-Out
81 class technique. What follows is a brief explaination of the code
84 We must create a subclass of B<Class::MOP::Instance> and override
85 the slot operations. This requires
86 overloading C<get_slot_value>, C<set_slot_value>, C<slot_initialized>, and
87 C<initialize_slot>, as well as their inline counterparts. Additionally we
88 overload C<add_slot> in order to initialize the global hash containing the
91 And that is pretty much all. Of course I am ignoring need for
92 inside-out objects to be C<DESTROY>-ed, and some other details as
93 well (threading, etc), but this is an example. A real implementation is left as
94 an exercise to the reader.
98 Stevan Little E<lt>stevan@iinteractive.comE<gt>
102 L<Tie::RefHash::Weak>
104 =head1 COPYRIGHT AND LICENSE
106 Copyright 2006 by Infinity Interactive, Inc.
108 L<http://www.iinteractive.com>
110 This library is free software; you can redistribute it and/or modify
111 it under the same terms as Perl itself.