001/*****************************************************************************
002 * Copyright (C) NanoContainer Organization. All rights reserved.            *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD      *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file.                                                     *
007 *                                                                           *
008 * Original code by Aslak Hellesoy & Joerg Schaible                                       *
009 *****************************************************************************/
010package org.picocontainer.gems.util;
011
012import com.thoughtworks.proxy.ProxyFactory;
013import com.thoughtworks.proxy.toys.multicast.Multicasting;
014import org.picocontainer.PicoContainer;
015
016import java.util.ArrayList;
017import java.util.Collections;
018import java.util.List;
019
020/**
021 * Factory for creating a multicaster object that multicasts calls to all
022 * components in a PicoContainer instance.
023 *
024 * @author Aslak Hellesøy
025 * @author Chris Stevenson
026 * @author Paul Hammant
027 */
028public class Multicaster {
029    /**
030     * Create a {@link Multicasting} proxy for the components of a {@link PicoContainer}.
031     * 
032     * @param pico the container
033     * @param callInInstantiationOrder <code>true</code> if the components will be called in instantiation order
034     * @param proxyFactory the ProxyFactory to use
035     * @return the Multicasting proxy
036     */
037    public static Object object(final PicoContainer pico, boolean callInInstantiationOrder, final ProxyFactory proxyFactory) {
038        List copy = new ArrayList(pico.getComponents());
039
040        if (!callInInstantiationOrder) {
041            // reverse the list
042            Collections.reverse(copy);
043        }
044        Object[] targets = copy.toArray();
045        return Multicasting.object(proxyFactory, targets);
046    }
047}