[Chicago-talk] super complex object

Steven Lembark lembark at wrkhors.com
Thu Aug 4 19:09:38 PDT 2005


> I really wish I understood anything you just said. I read over the
> documentation for  NEXT::init and still have no idea what it would be
> used for. I think it's the fact that  I'm self taught so don't understand
> a lot of the terminology. Sorry for my ignorance.

Say you want to have five classes that share data.
One way is to have them all stuff data into a single
object; problem there is the object gets bulky and
you get collisions between various uses of obvious
names.

Alternative is to have a metadata hash in each
class' package that is used to hold data for
objects that the class has seen.

You start out with:

    my %meta = ();

as you see an object that the class cares about
you can:

    my $obj = shift;

    $meta{ $obj } = { @$default_meta };

The trick here is that any object has a unique
stringified version.

Tim Bunce uses this for DBI: the $dbh handed
back by DBI->connect( ... ) is an empty hash.
This never fails to freak out a few people per
week on the DBI mailing list.

You don't see the stuff he manages with DBI.
Instead of using

    my $foo = $obj->{foo};

he uses:

    my $objmeta = $meta{ $obj } ||= { @default_meta };

    my $foo = $objmeta->{ foo };

which keeps the metaadata private to the DBI
class and its minions.

If you have a huge object then you could probably
use this technique -- along with multiple inheritence --
to sequestedr the private information for each base
class in a private are where they don't collide.

If you snag a copy of Perl Best Pratices it goes
over how to do this -- with working examples.

Any performance hit you'll see from this technique
is on the order of microseconds per call; which
shouldn't be painful for anthing more recent thatn
an x486...

-- 
Steven Lembark                                       85-09 90th Street
Workhorse Computing                                Woodhaven, NY 11421
lembark at wrkhors.com                                     1 888 359 3508


More information about the Chicago-talk mailing list