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 Joerg Schaibe                                            *
009 *****************************************************************************/
010
011package org.picocontainer.behaviors;
012
013import org.picocontainer.ComponentAdapter;
014import org.picocontainer.ComponentMonitor;
015import org.picocontainer.LifecycleStrategy;
016import org.picocontainer.Parameter;
017import org.picocontainer.PicoCompositionException;
018import org.picocontainer.behaviors.AbstractBehaviorFactory;
019
020import java.util.Properties;
021
022
023/**
024 * BehaviorFactory for Field Decorating. This factory will create {@link org.picocontainer.gems.behaviors.FieldDecorated} that will
025 * allow you to decorate fields on the component instance that has been created
026 *
027 * @author Paul Hammant
028 */
029public abstract class FieldDecorating extends AbstractBehaviorFactory implements FieldDecorated.Decorator {
030    private final Class<?> fieldClass;
031
032    public FieldDecorating(Class<?> fieldClass) {
033        this.fieldClass = fieldClass;
034    }
035
036    public ComponentAdapter createComponentAdapter(
037            ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, final Object componentKey, final Class componentImplementation, final Parameter... parameters)
038            throws PicoCompositionException {
039        return componentMonitor.newBehavior(new FieldDecorated(
040                super.createComponentAdapter(
041                        componentMonitor, lifecycleStrategy, componentProperties, componentKey, componentImplementation, parameters),
042                fieldClass, this));
043    }
044
045
046    public ComponentAdapter addComponentAdapter(ComponentMonitor componentMonitor,
047                                                LifecycleStrategy lifecycleStrategy,
048                                                Properties componentProperties,
049                                                ComponentAdapter adapter) {
050        return super.addComponentAdapter(componentMonitor,
051                lifecycleStrategy,
052                componentProperties,
053                adapter);
054    }
055}