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 * Idea by Rachel Davies, Original code by Jon Tirsen *
009 *****************************************************************************/
010
011 package org.picocontainer;
012
013 /**
014 * This class provides control over the arguments that will be passed to a constructor. It can be used for finer control over
015 * what arguments are passed to a particular constructor.
016 *
017 * @author Jon Tirsén
018 * @author Aslak Hellesøy
019 * @author Thomas Heller
020 * @see MutablePicoContainer#registerComponentImplementation(Object,Class,Parameter[]) a method on the
021 * {@link MutablePicoContainer} interface which allows passing in of an array of {@linkplain Parameter Parameters}.
022 * @see org.picocontainer.defaults.ComponentParameter an implementation of this interface that allows you to specify the key
023 * used for resolving the parameter.
024 * @see org.picocontainer.defaults.ConstantParameter an implementation of this interface that allows you to specify a constant
025 * that will be used for resolving the parameter.
026 * @since 1.0
027 */
028 public interface Parameter {
029 /**
030 * Retrieve the object from the Parameter that statisfies the expected type.
031 *
032 * @param container the container from which dependencies are resolved.
033 * @param adapter the {@link ComponentAdapter} that is asking for the instance
034 * @param expectedType the type that the returned instance needs to match.
035 * @return the instance or <code>null</code> if no suitable instance can be found.
036 * @throws PicoInitializationException if a referenced component could not be instantiated.
037 * @since 1.1
038 */
039 Object resolveInstance(PicoContainer container, ComponentAdapter adapter, Class expectedType);
040
041 /**
042 * Check if the Parameter can statisfy the expected type using the container.
043 *
044 * @param container the container from which dependencies are resolved.
045 * @param adapter the {@link ComponentAdapter} that is asking for the instance
046 * @param expectedType the required type
047 * @return <code>true</code> if the component parameter can be resolved.
048 * @since 1.1
049 */
050 boolean isResolvable(PicoContainer container, ComponentAdapter adapter, Class expectedType);
051
052 /**
053 * Verify that the Parameter can statisfied the expected type using the container
054 *
055 * @param container the container from which dependencies are resolved.
056 * @param adapter the {@link ComponentAdapter} that is asking for the verification
057 * @param expectedType the required type
058 * @throws PicoIntrospectionException if parameter and its dependencies cannot be resolved
059 * @since 1.1
060 */
061 void verify(PicoContainer container, ComponentAdapter adapter, Class expectedType);
062
063 /**
064 * Accepts a visitor for this Parameter. The method is normally called by visiting a {@link ComponentAdapter}, that
065 * cascades the {@linkplain PicoVisitor visitor} also down to all its {@linkplain Parameter Parameters}.
066 *
067 * @param visitor the visitor.
068 * @since 1.1
069 */
070 void accept(PicoVisitor visitor);
071 }