001    package org.picocontainer.behaviors;
002    
003    import org.picocontainer.ComponentAdapter;
004    import org.picocontainer.PicoCompositionException;
005    import org.picocontainer.PicoContainer;
006    
007    import java.lang.reflect.Field;
008    import java.lang.reflect.Type;
009    
010    @SuppressWarnings("serial")
011    public class FieldDecorated extends AbstractBehavior {
012        private final Class<?> fieldClass;
013        private final Decorator decorator;
014    
015        public FieldDecorated(ComponentAdapter delegate, Class<?> fieldClass, Decorator decorator) {
016            super(delegate);
017            this.fieldClass = fieldClass;
018            this.decorator = decorator;
019        }
020    
021        public Object getComponentInstance(final PicoContainer container, Type into)
022                throws PicoCompositionException {
023            Object instance = super.getComponentInstance(container, into);
024            Field[] fields = instance.getClass().getDeclaredFields();
025            for (int i = 0; i < fields.length; i++) {
026                Field field = fields[i];
027                if (field.getType() == fieldClass) {
028                    Object value = decorator.decorate(instance);
029                    field.setAccessible(true);
030                    try {
031                        field.set(instance, value);
032                    } catch (IllegalAccessException e) {
033                        throw new PicoCompositionException(e);
034                    }
035                }
036            }
037            return instance;
038        }
039    
040    
041        public String getDescriptor() {
042            return "FieldDecorated";
043        }
044    
045        public interface Decorator {
046    
047            Object decorate(Object instance);
048    
049    
050        }
051    
052    }