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     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.injectors;
011    
012    import org.picocontainer.ComponentMonitor;
013    import org.picocontainer.NameBinding;
014    import org.picocontainer.Parameter;
015    
016    import java.lang.reflect.AccessibleObject;
017    import java.lang.reflect.Method;
018    
019    @SuppressWarnings("serial")
020    public class NamedMethodInjector<T> extends SetterInjector<T> {
021    
022        public NamedMethodInjector(Object key,
023                                       Class<?> impl,
024                                       Parameter[] parameters,
025                                       ComponentMonitor monitor,
026                                       boolean optional) {
027            this(key, impl, parameters, monitor, "set", optional);
028        }
029    
030        public NamedMethodInjector(Object key,
031                                       Class<?> impl,
032                                       Parameter[] parameters,
033                                       ComponentMonitor monitor) {
034            this(key, impl, parameters, monitor, "set", true);
035        }
036    
037        public NamedMethodInjector(Object key,
038                                   Class<?> impl,
039                                   Parameter[] parameters,
040                                   ComponentMonitor monitor,
041                                   String prefix) {
042            this(key, impl, parameters, monitor, prefix, true);
043        }
044    
045        public NamedMethodInjector(Object key,
046                                   Class<?> impl,
047                                   Parameter[] parameters,
048                                   ComponentMonitor monitor,
049                                   String prefix,
050                                   boolean optional) {
051            super(key, impl, parameters, monitor, prefix, "", optional, true);
052        }
053    
054        @Override
055        protected NameBinding makeParameterNameImpl(final AccessibleObject member) {
056            return new NameBinding() {
057                public String getName() {
058                    String name = ((Method)member).getName().substring(prefix.length()); // string off 'set' or chosen prefix
059                    return name.substring(0,1).toLowerCase() + name.substring(1);  // change "SomeThing" to "someThing" 
060                }
061            };
062        }
063    
064        @Override
065        public String getDescriptor() {
066            return "NamedMethodInjection:";
067        }
068    
069    }