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 Aslak Hellesoy and Paul Hammant   *
009     *****************************************************************************/
010    
011    package org.picocontainer.behaviors;
012    
013    import org.picocontainer.Behavior;
014    import org.picocontainer.ComponentAdapter;
015    import org.picocontainer.ObjectReference;
016    import org.picocontainer.references.SimpleReference;
017    
018    /**
019     * <p>
020     * {@link ComponentAdapter} implementation that caches the component instance.
021     * </p>
022     * <p>
023     * This adapter supports components with a lifecycle, as it is a
024     * {@link Behavior lifecycle manager} which will apply the delegate's
025     * {@link org.picocontainer.LifecycleStrategy lifecycle strategy} to the cached
026     * component instance. The lifecycle state is maintained so that the component
027     * instance behaves in the expected way: it can't be started if already started,
028     * it can't be started or stopped if disposed, it can't be stopped if not
029     * started, it can't be disposed if already disposed.
030     * </p>
031     * 
032     * @author Mauro Talevi
033     */
034    @SuppressWarnings("serial")
035    public class Cached<T> extends Stored<T> {
036    
037    
038        public Cached(ComponentAdapter delegate) {
039                    this(delegate, new SimpleReference<Instance<T>>());
040            }
041    
042            public Cached(ComponentAdapter delegate, ObjectReference<Instance<T>> instanceReference) {
043                    super(delegate, instanceReference);
044            }
045    
046        public String getDescriptor() {
047            return "Cached" + getLifecycleDescriptor();
048        }
049    }