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" <pdenis@fotango.com>

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.

