[Israel.pm] Followup on Gaal's talk on Class::Accessor - inside out classes.

Yosef Meller mellerf at netvision.net.il
Sat Feb 28 12:52:23 PST 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all!

First, I really enjoyed the conference, it was very educating and I'm
only sorry I had to leave before the end. Kol Haqkavod to the organizers
~ and lecturers.

In one of the lightning talks, Gaal talked about the usefulness of
accessors and introduced Class::Accessor as a class that takes away most
of the work in dealing with accessors.

There are many good reasons for using accessors. However there was one
reason that was mentioned that I think is *not* one of those. This is
the subject of typos.

In the lecture it was mentioned that using hash keys as an object's
attributes makes it possible for a typo to go unnoticed and a very big
bug to be hard to detect, which is true. The solution sugested was to
use accessors even within your object to avoid the typos.

However, this has a downside of adding the call overhead where you need
a simple assignment. There must be a better way, right? Right.

There's a technique called inside out objects, in which an attribute,
rather than being a key in a hash, is a hash in itself keyed by object
references. Like so:

package MyModule;

my (%name, %colour, %air_speed_of_a_swallow);

sub new {
	return bless {}; # Empty, we only need it for a reference.
}

sub ask_me {
	my $self = shift;
	return "my name is $name{$self}
		and my colour is $colour{$self}.";
}

sub DESTROY {  # We must release memory manually
	my $self = shift;
	foreach(\%name, \%colour, \%air_speed_of_a_swallow) {
		delete $_->{$self}
	}
}


This way we catch typos with the usual 'use strict' and we can still use
~ the attributes directly.

As the perl word goes, there are modules on CPAN similar to
Class::Accessor that work with inside out classes. I just can't
remmember which ones.

Just thought I'd share it with you.

- --
perl -e'$b=unpack"b*",pack"H*","59dfce2d6b1664d3b26cd9969503";
for(;$a<length$b;$a+=9){print+pack"b8",substr$b,$a,8;}'

My public key:
http://wwwkeys.pgp.net:11371/pks/lookup?op=get&search=0x3D2CA0A8
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFAQP+HaElZPz0soKgRAl/HAKCN4so1pNV2PvTTno3EVEYm6lWyswCeIJWV
Cze2EcA7pHcmABGnkWpgLgE=
=roeF
-----END PGP SIGNATURE-----



More information about the Perl mailing list