001 /***************************************************************************** 002 * Copyright (c) PicoContainer 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 package org.picocontainer.monitors; 009 010 import org.picocontainer.ComponentMonitor; 011 import org.picocontainer.MutablePicoContainer; 012 import org.picocontainer.PicoContainer; 013 014 /** 015 * The first of a list of composers passed in that responds with an instance for a missing component will 016 * be used. 017 */ 018 public class ComposingMonitor extends AbstractComponentMonitor { 019 private Composer[] composers; 020 021 public ComposingMonitor(ComponentMonitor delegate, Composer... composers) { 022 super(delegate); 023 this.composers = composers; 024 } 025 026 public ComposingMonitor(Composer... composers) { 027 this.composers = composers; 028 } 029 030 @Override 031 public Object noComponentFound(MutablePicoContainer container, Object componentKey) { 032 for (Composer composer : composers) { 033 Object retVal = composer.compose(container, componentKey); 034 if (retVal != null) { 035 return retVal; 036 } 037 } 038 return super.noComponentFound(container, componentKey); 039 } 040 041 /** 042 * A Composer can be used to make components that are otherwise missing. 043 */ 044 public static interface Composer { 045 public Object compose(PicoContainer container, Object componentKey); 046 } 047 048 049 }