NAME Class::Composite - Implements Composite patterns SYNOPSIS ========================= Collection implementation ========================= use Class::Composite; my $collection = Class::Composite::Container->new(); my $element = Class::Composite::Element->new(); $collection->addElement( $elem ); $elements = $collection->getElements(); ======================== Composite implementation ======================== package graphicBase; # Base for graphics containers and elements sub display { my $self = shift; foreach my $elem (@{$self->getElements()}) { $elem->display(); } paint($elem); } package graphicElement; use base qw( Class::Composite::Element graphicBase ); package graphicContainer; use base qw( Class::Composite::Container graphicBase ); package main; use graphicElement; use graphicContainer; my $element = graphicElement->new(); my $container = graphicContainer->new(); $container->addElement( $element ); $container->display(); DESCRIPTION "Class::Composite" is used to provide mechanisms used by "Class::Composite::Container" and "Class::Composite::Element". Class::Composite::* implements a Composite pattern (see OO Patterns books and http://www.uni-paderborn.de/cs/ag-schaefer/Lehre/Lehrveranstaltungen/Vor lesungen/Entwurfsmuster/WS0102/DPSA-IVb.pdf for example). A composite pattern is a collection implementation which provides same methods to the container and elements. The reason for using a Composite pattern is to have the same interface to deal with different objects and their containers (collections). If you only need a collection implementation, then you can inherite from Class::Composite::Container and Class::Composite::Element directly. If you need specific method that should be applied to both your container and your elements (which is what the Class::Composite is made for), then you isolate the methods you want to apply on both elements and containers in a specific package. Then, you inherite from both your package and Class::Composite::Element for elements, and Class::Composite::Container for containers. INHERITANCE Class::Base getAll() Returns an array ref of all elements below, whatever their depth or type. getLeaves(start, end) Returns all Class::Composite::Element contained in the collection, whatever their depth. getElements() Returns the elements just below the current object. Returns [] must probably be overriden by child classes. getElement() Returns undef must probably be overriden by child classes nOfElements() Returns undef, to be overriden by child class elementType() Returns the class the element must belongs to, default is Class::Composite. Sets it to undef if you don't want any checking to occur. To be overriden in Child class. applyToAll( $sub ) Applies the subroutine $sub to all elements. The subroutine will receive a collection element as a parameter. SEE ALSO Class::Composite::Container, Class::Composite::Element http://opensource.fotango.com/ for other goodies AUTHOR "Pierre Denis" ACKNOWLEDGEMENTS Thanks to Leon Brocard and James Duncan for their input and suggestions. COPYRIGHT Copyright (C) 2002, Fotango Ltd. All rights reserved. This is free software. This software may be modified and/or distributed under the same terms as Perl itself.