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 *****************************************************************************/
010 package org.picocontainer.gems.util;
011
012 import com.thoughtworks.proxy.ProxyFactory;
013 import com.thoughtworks.proxy.toys.multicast.Multicasting;
014 import org.picocontainer.PicoContainer;
015
016 import java.util.ArrayList;
017 import java.util.Collections;
018 import 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 * @since 1.2
028 */
029 public class Multicaster {
030 /**
031 * Create a {@link Multicasting} proxy for the components of a {@link PicoContainer}.
032 *
033 * @param pico the container
034 * @param callInInstantiationOrder <code>true</code> if the components will be called in instantiation order
035 * @param proxyFactory the ProxyFactory to use
036 * @return the Multicasting proxy
037 * @since 1.2
038 */
039 public static Object object(PicoContainer pico, boolean callInInstantiationOrder, ProxyFactory proxyFactory) {
040 List copy = new ArrayList(pico.getComponentInstances());
041
042 if (!callInInstantiationOrder) {
043 // reverse the list
044 Collections.reverse(copy);
045 }
046 Object[] targets = copy.toArray();
047 return Multicasting.object(proxyFactory, targets);
048 }
049 }