You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/07/07 21:34:02 UTC

svn commit: r1143993 [1/2] - in /tapestry/tapestry5/trunk: plastic/src/main/java/org/apache/tapestry5/internal/plastic/ plastic/src/main/java/org/apache/tapestry5/plastic/ tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ tapestry-co...

Author: hlship
Date: Thu Jul  7 19:34:01 2011
New Revision: 1143993

URL: http://svn.apache.org/viewvc?rev=1143993&view=rev
Log:
TAP5-1549: Refactor ParameterWorker and BindParameterWorker to ComponentClassTransformWorker2
Change the way generics are used in PlasticField.setConduit() and setComputedConduit()
Change ParameterConduit to extend from FieldConduit, not the old FieldValueConduit
Add NamedSet.eachValue() to apply an operation to each value stored in the set

Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticField.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/EnvironmentalWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ReadOnlyFieldValueConduit.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/NamedSet.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java Thu Jul  7 19:34:01 2011
@@ -14,59 +14,16 @@
 
 package org.apache.tapestry5.internal.plastic;
 
+import org.apache.tapestry5.internal.plastic.asm.Opcodes;
+import org.apache.tapestry5.internal.plastic.asm.Type;
+import org.apache.tapestry5.internal.plastic.asm.tree.*;
+import org.apache.tapestry5.plastic.*;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tapestry5.internal.plastic.asm.Opcodes;
-import org.apache.tapestry5.internal.plastic.asm.Type;
-import org.apache.tapestry5.internal.plastic.asm.tree.AbstractInsnNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.AnnotationNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.ClassNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.FieldInsnNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.FieldNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.InsnList;
-import org.apache.tapestry5.internal.plastic.asm.tree.MethodInsnNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.MethodNode;
-import org.apache.tapestry5.internal.plastic.asm.tree.VarInsnNode;
-import org.apache.tapestry5.plastic.AnnotationAccess;
-import org.apache.tapestry5.plastic.ClassInstantiator;
-import org.apache.tapestry5.plastic.ClassType;
-import org.apache.tapestry5.plastic.ComputedValue;
-import org.apache.tapestry5.plastic.Condition;
-import org.apache.tapestry5.plastic.FieldConduit;
-import org.apache.tapestry5.plastic.FieldHandle;
-import org.apache.tapestry5.plastic.InstanceContext;
-import org.apache.tapestry5.plastic.InstructionBuilder;
-import org.apache.tapestry5.plastic.InstructionBuilderCallback;
-import org.apache.tapestry5.plastic.LocalVariable;
-import org.apache.tapestry5.plastic.LocalVariableCallback;
-import org.apache.tapestry5.plastic.MethodAdvice;
-import org.apache.tapestry5.plastic.MethodDescription;
-import org.apache.tapestry5.plastic.MethodHandle;
-import org.apache.tapestry5.plastic.MethodInvocation;
-import org.apache.tapestry5.plastic.MethodInvocationResult;
-import org.apache.tapestry5.plastic.MethodParameter;
-import org.apache.tapestry5.plastic.PlasticClass;
-import org.apache.tapestry5.plastic.PlasticField;
-import org.apache.tapestry5.plastic.PlasticMethod;
-import org.apache.tapestry5.plastic.PlasticUtils;
-import org.apache.tapestry5.plastic.PropertyAccessType;
-import org.apache.tapestry5.plastic.SwitchBlock;
-import org.apache.tapestry5.plastic.SwitchCallback;
-import org.apache.tapestry5.plastic.TransformationOption;
-import org.apache.tapestry5.plastic.TryCatchBlock;
-import org.apache.tapestry5.plastic.TryCatchCallback;
+import java.util.*;
 
 @SuppressWarnings("all")
 public class PlasticClassImpl extends Lockable implements PlasticClass, InternalPlasticClassTransformation, Opcodes
@@ -337,8 +294,7 @@ public class PlasticClassImpl extends Lo
                     if (Modifier.isPrivate(providerDescriptor.modifiers))
                     {
                         builder.invokeSpecial(className, providerDescriptor);
-                    }
-                    else
+                    } else
                     {
                         builder.invokeVirtual(className, delegateType, providerDescriptor.methodName);
                     }
@@ -704,7 +660,7 @@ public class PlasticClassImpl extends Lo
             return this;
         }
 
-        public PlasticField setConduit(FieldConduit<?> conduit)
+        public <F> PlasticField setConduit(FieldConduit<F> conduit)
         {
             assert conduit != null;
 
@@ -728,7 +684,7 @@ public class PlasticClassImpl extends Lo
             return this;
         }
 
-        public PlasticField setComputedConduit(ComputedValue<FieldConduit<?>> computedConduit)
+        public <F> PlasticField setComputedConduit(ComputedValue<FieldConduit<F>> computedConduit)
         {
             assert computedConduit != null;
 
@@ -787,7 +743,7 @@ public class PlasticClassImpl extends Lo
                 String signature = node.signature == null ? null : "(" + node.signature + ")V";
 
                 introduceAccessorMethod("void", "set" + capitalized, new String[]
-                { getTypeName() }, signature, new InstructionBuilderCallback()
+                        {getTypeName()}, signature, new InstructionBuilderCallback()
                 {
                     public void doBuild(InstructionBuilder builder)
                     {
@@ -802,7 +758,7 @@ public class PlasticClassImpl extends Lo
         }
 
         private void introduceAccessorMethod(String returnType, String name, String[] parameterTypes, String signature,
-                InstructionBuilderCallback callback)
+                                             InstructionBuilderCallback callback)
         {
             MethodDescription description = new MethodDescription(ACC_PUBLIC, returnType, name, parameterTypes,
                     signature, null);
@@ -882,8 +838,7 @@ public class PlasticClassImpl extends Lo
                     // Dupe this under the wide value, then pop the wide value
 
                     builder.dupeWide().loadThis().dupe(2).pop();
-                }
-                else
+                } else
                 {
                     builder.dupe().loadThis().swap();
                 }
@@ -986,7 +941,9 @@ public class PlasticClassImpl extends Lo
             }
         }
 
-        /** Invoked with the object instance on the stack and cast to the right type. */
+        /**
+         * Invoked with the object instance on the stack and cast to the right type.
+         */
         void extendShimGet(SwitchBlock switchBlock)
         {
             if (getAccess == null)
@@ -1065,7 +1022,9 @@ public class PlasticClassImpl extends Lo
 
         private final String invocationClassName;
 
-        /** The new method that uses the original instructions from the advisedMethodNode. */
+        /**
+         * The new method that uses the original instructions from the advisedMethodNode.
+         */
         private final String newMethodName;
 
         private final String[] constructorTypes;
@@ -1084,7 +1043,7 @@ public class PlasticClassImpl extends Lo
 
             invocationClassNode.visit(V1_5, ACC_PUBLIC | ACC_FINAL, nameCache.toInternalName(invocationClassName),
                     null, ABSTRACT_METHOD_INVOCATION_INTERNAL_NAME, new String[]
-                    { nameCache.toInternalName(MethodInvocation.class) });
+                    {nameCache.toInternalName(MethodInvocation.class)});
 
             constructorTypes = createFieldsAndConstructor();
 
@@ -1182,8 +1141,7 @@ public class PlasticClassImpl extends Lo
             if (isVoid)
             {
                 builder.loadNull().returnResult();
-            }
-            else
+            } else
             {
                 builder.loadThis().getField(invocationClassName, RETURN_VALUE, description.returnType)
                         .boxPrimitive(description.returnType).returnResult();
@@ -1199,8 +1157,7 @@ public class PlasticClassImpl extends Lo
                 builder.throwException(IllegalArgumentException.class, String
                         .format("Method %s of class %s is void, setting a return value is not allowed.", description,
                                 className));
-            }
-            else
+            } else
             {
                 builder.loadThis().loadArgument(0);
                 builder.castOrUnbox(description.returnType);
@@ -1219,8 +1176,7 @@ public class PlasticClassImpl extends Lo
             if (description.argumentTypes.length == 0)
             {
                 indexOutOfRange(builder);
-            }
-            else
+            } else
             {
                 builder.loadArgument(0);
                 builder.startSwitch(0, description.argumentTypes.length - 1, new SwitchCallback()
@@ -1262,8 +1218,7 @@ public class PlasticClassImpl extends Lo
             if (description.argumentTypes.length == 0)
             {
                 indexOutOfRange(builder);
-            }
-            else
+            } else
             {
                 builder.loadArgument(0).startSwitch(0, description.argumentTypes.length - 1, new SwitchCallback()
                 {
@@ -1315,7 +1270,9 @@ public class PlasticClassImpl extends Lo
             classNode.methods.add(mn);
         }
 
-        /** Invoke the "new" method, and deal with the return value and/or thrown exceptions. */
+        /**
+         * Invoke the "new" method, and deal with the return value and/or thrown exceptions.
+         */
         private void createProceedToAdvisedMethod()
         {
             InstructionBuilder builder = newMethod("proceedToAdvisedMethod", void.class);
@@ -1472,7 +1429,8 @@ public class PlasticClassImpl extends Lo
      * Methods that require special attention inside {@link #createInstantiator()} because they
      * have method advice.
      */
-    private final Set<PlasticMethodImpl> advisedMethods = PlasticInternalUtils.newSet();;
+    private final Set<PlasticMethodImpl> advisedMethods = PlasticInternalUtils.newSet();
+    ;
 
     private final NameCache nameCache = new NameCache();
 
@@ -1540,7 +1498,7 @@ public class PlasticClassImpl extends Lo
      * @param parentStaticContext
      */
     public PlasticClassImpl(ClassNode classNode, PlasticClassPool pool, MethodBundle parentMethodBundle,
-            StaticContext parentStaticContext)
+                            StaticContext parentStaticContext)
     {
         this.classNode = classNode;
         this.pool = pool;
@@ -1568,8 +1526,7 @@ public class PlasticClassImpl extends Lo
                 {
                     originalConstructor = node;
                     fieldTransformMethods.add(node);
-                }
-                else
+                } else
                 {
                     node.instructions.clear();
 
@@ -1656,8 +1613,7 @@ public class PlasticClassImpl extends Lo
             constructorBuilder.loadThis().loadArgument(0).loadArgument(1);
             constructorBuilder.invokeConstructor(superClassName, StaticContext.class.getName(),
                     InstanceContext.class.getName());
-        }
-        else
+        } else
         {
             // Assumes the base class includes a visible constructor that takes no arguments.
             // TODO: Do a proper check for this case and throw a meaningful exception
@@ -1731,8 +1687,7 @@ public class PlasticClassImpl extends Lo
             Constructor ctor = clazz.getConstructor(StaticContext.class, InstanceContext.class);
 
             return new ClassInstantiatorImpl(clazz, ctor, staticContext);
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
             throw new RuntimeException(String.format("Unable to create ClassInstantiator for class %s: %s",
                     clazz.getName(), PlasticInternalUtils.toMessage(ex)), ex);
@@ -1863,7 +1818,7 @@ public class PlasticClassImpl extends Lo
     }
 
     public PlasticMethod introducePrivateMethod(String typeName, String suggestedName, String[] argumentTypes,
-            String[] exceptionTypes)
+                                                String[] exceptionTypes)
     {
         check();
 
@@ -2137,8 +2092,7 @@ public class PlasticClassImpl extends Lo
             Class shimClass = pool.realize(className, ClassType.SUPPORT, shimClassNode);
 
             return (PlasticClassHandleShim) shimClass.newInstance();
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
             throw new RuntimeException(
                     String.format("Unable to instantiate shim class %s for plastic class %s: %s",
@@ -2306,9 +2260,11 @@ public class PlasticClassImpl extends Lo
         return instanceContextFieldName;
     }
 
-    /** Creates a new private final field and initializes its value (using the StaticContext). */
+    /**
+     * Creates a new private final field and initializes its value (using the StaticContext).
+     */
     private String createAndInitializeFieldFromStaticContext(String suggestedFieldName, String fieldType,
-            Object injectedFieldValue)
+                                                             Object injectedFieldValue)
     {
         String name = makeUnique(fieldNames, suggestedFieldName);
 
@@ -2441,7 +2397,7 @@ public class PlasticClassImpl extends Lo
     /**
      * True if the node has any visible annotations, or it has visible annotations on any
      * parameter.
-     * 
+     *
      * @param mn
      * @return true if any annotations present
      */

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticField.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticField.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticField.java Thu Jul  7 19:34:01 2011
@@ -107,13 +107,13 @@ public interface PlasticField extends An
      * <p>
      * Normally, once a conduit is in place, the field will never be actually read or written. This is problematic for
      * debugging, so {@link TransformationOption#FIELD_WRITEBEHIND} is useful when operating in a non-production mode.
-     * 
+     *
      * @return the field for further manipulation
      * @throws IllegalStateException
      *             if the field already has an injection or a conduit
      * @return this field for further manipulation
      */
-    PlasticField setConduit(FieldConduit<?> conduit);
+    <F> PlasticField setConduit(FieldConduit<F> conduit);
 
     /**
      * Sets the conduit for the field to a value computed when the class is instantiated
@@ -122,7 +122,7 @@ public interface PlasticField extends An
      *            object that will compute the actual conduit to be used
      * @return this field for further manipulation
      */
-    PlasticField setComputedConduit(ComputedValue<FieldConduit<?>> computedConduit);
+   <F>  PlasticField setComputedConduit(ComputedValue<FieldConduit<F>> computedConduit);
 
     /**
      * Creates access to the field, using the default property name derived from the name of the field.

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java Thu Jul  7 19:34:01 2011
@@ -14,18 +14,8 @@
 
 package org.apache.tapestry5.internal.structure;
 
-import java.lang.annotation.Annotation;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tapestry5.Binding;
-import org.apache.tapestry5.Block;
-import org.apache.tapestry5.ComponentEventCallback;
-import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.EventContext;
-import org.apache.tapestry5.Link;
-import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.*;
+import org.apache.tapestry5.func.Worker;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.bindings.InternalPropBinding;
 import org.apache.tapestry5.internal.services.Instantiator;
@@ -42,11 +32,17 @@ import org.apache.tapestry5.ioc.internal
 import org.apache.tapestry5.ioc.services.PerThreadValue;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.runtime.Component;
+import org.apache.tapestry5.runtime.PageLifecycleAdapter;
 import org.apache.tapestry5.runtime.PageLifecycleListener;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
 import org.slf4j.Logger;
 
+import java.lang.annotation.Annotation;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
 /**
  * The bridge between a component and its {@link ComponentPageElement}, that supplies all kinds of
  * resources to the
@@ -132,9 +128,26 @@ public class InternalComponentResourcesI
         }
     }
 
+
+    private static Worker<ParameterConduit> RESET_PARAMETER_CONDUIT = new Worker<ParameterConduit>()
+    {
+        public void work(ParameterConduit value)
+        {
+            value.reset();
+        }
+    };
+
+    private static Worker<ParameterConduit> LOAD_PARAMETER_CONDUIT = new Worker<ParameterConduit>()
+    {
+        public void work(ParameterConduit value)
+        {
+            value.load();
+        }
+    };
+
     public InternalComponentResourcesImpl(Page page, ComponentPageElement element,
-            ComponentResources containerResources, ComponentPageElementResources elementResources, String completeId,
-            String nestedId, Instantiator componentInstantiator, boolean mixin)
+                                          ComponentResources containerResources, ComponentPageElementResources elementResources, String completeId,
+                                          String nestedId, Instantiator componentInstantiator, boolean mixin)
     {
         this.page = page;
         this.element = element;
@@ -309,8 +322,7 @@ public class InternalComponentResourcesI
         try
         {
             page.persistFieldChange(this, fieldName, newValue);
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
             throw new TapestryException(StructureMessages.fieldPersistFailure(getCompleteId(), fieldName, ex),
                     getLocation(), ex);
@@ -511,6 +523,8 @@ public class InternalComponentResourcesI
 
         if (variablesMap != null)
             variablesMap.clear();
+
+        resetParameterConduits();
     }
 
     public void addPageLifecycleListener(PageLifecycleListener listener)
@@ -528,6 +542,25 @@ public class InternalComponentResourcesI
         page.addResetListener(listener);
     }
 
+
+
+    private synchronized void resetParameterConduits()
+    {
+        if (conduits != null)
+        {
+            conduits.eachValue(RESET_PARAMETER_CONDUIT);
+        }
+    }
+
+    private synchronized void loadParameterConduits()
+    {
+        // Don't need the conduits != null, because this method will only be invoked
+        // when conduits is non-null.
+
+        conduits.eachValue(LOAD_PARAMETER_CONDUIT);
+    }
+
+
     public synchronized ParameterConduit getParameterConduit(String parameterName)
     {
         return NamedSet.get(conduits, parameterName);
@@ -536,19 +569,37 @@ public class InternalComponentResourcesI
     public synchronized void setParameterConduit(String parameterName, ParameterConduit conduit)
     {
         if (conduits == null)
+        {
             conduits = NamedSet.create();
 
+            page.addLifecycleListener(new PageLifecycleAdapter()
+            {
+                @Override
+                public void containingPageDidLoad()
+                {
+                    loadParameterConduits();
+                }
+            });
+
+        }
+
         conduits.put(parameterName, conduit);
     }
 
+
     public String getPropertyName(String parameterName)
     {
         Binding binding = getBinding(parameterName);
 
         if (binding == null)
+        {
             return null;
+        }
 
-        if (binding instanceof InternalPropBinding) { return ((InternalPropBinding) binding).getPropertyName(); }
+        if (binding instanceof InternalPropBinding)
+        {
+            return ((InternalPropBinding) binding).getPropertyName();
+        }
 
         return null;
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java Thu Jul  7 19:34:01 2011
@@ -14,7 +14,6 @@
 
 package org.apache.tapestry5.internal.transform;
 
-import java.util.List;
 
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.BindParameter;
@@ -23,26 +22,26 @@ import org.apache.tapestry5.internal.ser
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
-import org.apache.tapestry5.ioc.services.FieldValueConduit;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
 import org.apache.tapestry5.ioc.util.AvailableValues;
 import org.apache.tapestry5.ioc.util.UnknownValueException;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.services.ClassTransformation;
-import org.apache.tapestry5.services.ComponentClassTransformWorker;
-import org.apache.tapestry5.services.ComponentValueProvider;
-import org.apache.tapestry5.services.TransformField;
+import org.apache.tapestry5.plastic.*;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
+
+import java.util.List;
 
 /**
  * Responsible for identifying, via the {@link org.apache.tapestry5.annotations.BindParameter} annotation, mixin fields
  * that should be bound to a core-component parameter value.
- * 
+ *
  * @since 5.2.0
  */
-public class BindParameterWorker implements ComponentClassTransformWorker
+public class BindParameterWorker implements ComponentClassTransformWorker2
 {
-    private final class BoundParameterFieldValueConduit implements FieldValueConduit
+    private final class BoundParameterFieldValueConduit implements FieldConduit<Object>
     {
         private final String containerParameterName;
 
@@ -54,7 +53,7 @@ public class BindParameterWorker impleme
         private ParameterConduit conduit;
 
         private BoundParameterFieldValueConduit(String containerParameterName,
-                InternalComponentResources containerResources, Class fieldType)
+                                                InternalComponentResources containerResources, Class fieldType)
         {
             this.containerParameterName = containerParameterName;
             this.containerResources = containerResources;
@@ -78,23 +77,24 @@ public class BindParameterWorker impleme
             return conduit;
         }
 
-        public void set(Object newValue)
-        {
-            getParameterConduit().set(newValue);
-        }
 
-        @SuppressWarnings("unchecked")
-        public Object get()
+        public Object get(Object instance, InstanceContext context)
         {
             // For the moment, this results in two passes through the TypeCoercer; we'll look
             // to optimize that in the future. The first pass is deep inside ParameterConduit (coercing
             // to the component parameter field type), the second is here (usually the same type so no
             // real coercion necessary).
 
-            Object result = getParameterConduit().get();
+            Object result = getParameterConduit().get(instance, context);
 
             return typeCoercer.coerce(result, fieldType);
         }
+
+        public void set(Object instance, InstanceContext context, Object newValue)
+        {
+            getParameterConduit().set(instance, context, newValue);
+
+        }
     }
 
     private final TypeCoercer typeCoercer;
@@ -107,13 +107,15 @@ public class BindParameterWorker impleme
         this.componentClassCache = componentClassCache;
     }
 
-    public void transform(final ClassTransformation transformation, MutableComponentModel model)
+    public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
     {
-        for (TransformField field : transformation.matchFieldsWithAnnotation(BindParameter.class))
+        for (PlasticField field : plasticClass.getFieldsWithAnnotation(BindParameter.class))
+        {
             convertFieldIntoContainerBoundParameter(field);
+        }
     }
 
-    private void convertFieldIntoContainerBoundParameter(TransformField field)
+    private void convertFieldIntoContainerBoundParameter(PlasticField field)
     {
         BindParameter annotation = field.getAnnotation(BindParameter.class);
 
@@ -121,34 +123,35 @@ public class BindParameterWorker impleme
 
         final String[] possibleNames = annotation.value();
 
-        final String fieldTypeName = field.getType();
+        final String fieldTypeName = field.getTypeName();
 
         final String fieldName = field.getName();
 
-        ComponentValueProvider<FieldValueConduit> provider = new ComponentValueProvider<FieldValueConduit>()
+        ComputedValue<FieldConduit<Object>> computedConduit = new ComputedValue<FieldConduit<Object>>()
         {
-            public FieldValueConduit get(final ComponentResources resources)
+            public FieldConduit<Object> get(InstanceContext context)
             {
+                ComponentResources resources = context.get(ComponentResources.class);
+
                 try
                 {
-                    return createFieldValueConduit(resources, fieldTypeName, fieldName, possibleNames);
-                }
-                catch (Exception ex)
+                    return createConduit(resources, fieldTypeName, fieldName, possibleNames);
+                } catch (Exception ex)
                 {
                     throw new TapestryException(String.format(
                             "Failure binding parameter field '%s' of mixin %s (type %s): %s", fieldName, resources
-                                    .getCompleteId(), resources.getComponentModel().getComponentClassName(),
+                            .getCompleteId(), resources.getComponentModel().getComponentClassName(),
                             InternalUtils.toMessage(ex)), ex);
                 }
             }
 
         };
 
-        field.replaceAccess(provider);
+        field.setComputedConduit(computedConduit);
     }
 
-    private FieldValueConduit createFieldValueConduit(final ComponentResources resources, final String fieldTypeName,
-            final String fieldName, final String[] possibleNames)
+    private FieldConduit<Object> createConduit(final ComponentResources resources, final String fieldTypeName,
+                                               final String fieldName, final String[] possibleNames)
     {
         if (!resources.isMixin())
             throw new TapestryException(TransformMessages.bindParameterOnlyOnMixin(fieldName, resources), null);
@@ -185,11 +188,11 @@ public class BindParameterWorker impleme
 
         String message = String.format("Containing component %s does not contain a formal parameter %s %s.",
 
-        model.getComponentClassName(),
+                model.getComponentClassName(),
 
-        guesses.size() == 1 ? "matching" : "matching any of",
+                guesses.size() == 1 ? "matching" : "matching any of",
 
-        InternalUtils.joinSorted(guesses));
+                InternalUtils.joinSorted(guesses));
 
         throw new UnknownValueException(message, new AvailableValues("Formal parameters", model
                 .getDeclaredParameterNames()));

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java Thu Jul  7 19:34:01 2011
@@ -122,7 +122,7 @@ public class BridgeClassTransformation i
         };
     }
 
-    private static FieldConduit<?> toFieldConduit(final FieldValueConduit fieldValueConduit)
+    private static FieldConduit<Object> toFieldConduit(final FieldValueConduit fieldValueConduit)
     {
         return new FieldConduit<Object>()
         {
@@ -218,7 +218,7 @@ public class BridgeClassTransformation i
         }
 
         private static final class WrapCVP_FieldValueConduit_as_CV_FieldConduit implements
-                ComputedValue<FieldConduit<?>>
+                ComputedValue<FieldConduit<Object>>
         {
             private final ComponentValueProvider<FieldValueConduit> conduitProvider;
 
@@ -228,7 +228,7 @@ public class BridgeClassTransformation i
                 this.conduitProvider = conduitProvider;
             }
 
-            public FieldConduit<?> get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 ComponentResources resources = context.get(ComponentResources.class);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java Thu Jul  7 19:34:01 2011
@@ -91,17 +91,17 @@ public class ComponentWorker implements 
     {
         String fieldName = field.getName();
 
-        ComputedValue<FieldConduit<?>> provider = createProviderForEmbeddedComponentConduit(fieldName, id);
+        ComputedValue<FieldConduit<Object>> computedConduit = createProviderForEmbeddedComponentConduit(fieldName, id);
 
-        field.setComputedConduit(provider);
+        field.setComputedConduit(computedConduit);
     }
 
-    private ComputedValue<FieldConduit<?>> createProviderForEmbeddedComponentConduit(final String fieldName,
+    private ComputedValue<FieldConduit<Object>> createProviderForEmbeddedComponentConduit(final String fieldName,
             final String id)
     {
-        return new ComputedValue<FieldConduit<?>>()
+        return new ComputedValue<FieldConduit<Object>>()
         {
-            public FieldConduit get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 final ComponentResources resources = context.get(ComponentResources.class);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/EnvironmentalWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/EnvironmentalWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/EnvironmentalWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/EnvironmentalWorker.java Thu Jul  7 19:34:01 2011
@@ -92,9 +92,9 @@ public class EnvironmentalWorker impleme
 
         final boolean required = annotation.value();
 
-        ComputedValue<FieldConduit<?>> provider = new ComputedValue<FieldConduit<?>>()
+        ComputedValue<FieldConduit<Object>> provider = new ComputedValue<FieldConduit<Object>>()
         {
-            public FieldConduit<?> get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 return new EnvironmentalConduit(componentClassName, fieldName, fieldType, required);
             }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java Thu Jul  7 19:34:01 2011
@@ -40,7 +40,7 @@ public class InjectComponentWorker imple
         private Component embedded;
 
         private InjectedComponentFieldValueConduit(final ComponentResources resources, String fieldName, String type,
-                String componentId)
+                                                   String componentId)
         {
             super(resources, fieldName);
 
@@ -72,7 +72,7 @@ public class InjectComponentWorker imple
                                 .format(
                                         "Unable to inject component '%s' into field %s of component %s.  Class %s is not assignable to a field of type %s.",
                                         componentId, fieldName, resources.getCompleteId(), embedded.getClass()
-                                                .getName(), fieldType.getName()));
+                                        .getName(), fieldType.getName()));
         }
 
         public Object get(Object instance, InstanceContext context)
@@ -102,9 +102,9 @@ public class InjectComponentWorker imple
 
             final String fieldName = field.getName();
 
-            ComputedValue<FieldConduit<?>> provider = new ComputedValue<FieldConduit<?>>()
+            ComputedValue<FieldConduit<Object>> provider = new ComputedValue<FieldConduit<Object>>()
             {
-                public FieldConduit<?> get(InstanceContext context)
+                public FieldConduit<Object> get(InstanceContext context)
                 {
                     ComponentResources resources = context.get(ComponentResources.class);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java Thu Jul  7 19:34:01 2011
@@ -51,21 +51,21 @@ public class InjectContainerWorker imple
 
         field.claim(annotation);
 
-        ComputedValue<FieldConduit<?>> provider = createFieldValueConduitProvider(field);
+        ComputedValue<FieldConduit<Object>> provider = createFieldValueConduitProvider(field);
 
         field.setComputedConduit(provider);
     }
 
-    private ComputedValue<FieldConduit<?>> createFieldValueConduitProvider(PlasticField field)
+    private ComputedValue<FieldConduit<Object>> createFieldValueConduitProvider(PlasticField field)
     {
 
         final String fieldName = field.getName();
 
         final String fieldTypeName = field.getTypeName();
 
-        return new ComputedValue<FieldConduit<?>> ()
+        return new ComputedValue<FieldConduit<Object>> ()
         {
-            public FieldConduit<?> get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 final Class fieldType = cache.forName(fieldTypeName);
                 final ComponentResources resources = context.get(ComponentResources.class);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java Thu Jul  7 19:34:01 2011
@@ -27,7 +27,7 @@ import org.apache.tapestry5.services.tra
 
 /**
  * Peforms transformations that allow pages to be injected into components.
- * 
+ *
  * @see org.apache.tapestry5.annotations.InjectPage
  */
 public class InjectPageWorker implements ComponentClassTransformWorker2
@@ -39,7 +39,7 @@ public class InjectPageWorker implements
         private Object page;
 
         private InjectedPageConduit(ComponentResources resources, String fieldName,
-                String injectedPageName)
+                                    String injectedPageName)
         {
             super(resources, fieldName);
 
@@ -95,9 +95,9 @@ public class InjectPageWorker implements
         final String injectedPageName = InternalUtils.isBlank(pageName) ? resolver
                 .resolvePageClassNameToPageName(field.getTypeName()) : pageName;
 
-        ComputedValue<FieldConduit<?>> provider = new ComputedValue<FieldConduit<?>>()
+        ComputedValue<FieldConduit<Object>> provider = new ComputedValue<FieldConduit<Object>>()
         {
-            public FieldConduit<?> get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 ComponentResources resources = context.get(ComponentResources.class);
                 return new InjectedPageConduit(resources, fieldName, injectedPageName);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java Thu Jul  7 19:34:01 2011
@@ -70,15 +70,15 @@ public class MixinWorker implements Comp
 
     private void replaceFieldAccessWithMixin(PlasticField field, String mixinClassName)
     {
-        ComputedValue<FieldConduit<?>> provider = createMixinFieldProvider(field.getName(), mixinClassName);
+        ComputedValue<FieldConduit<Object>> provider = createMixinFieldProvider(field.getName(), mixinClassName);
 
         field.setComputedConduit(provider);
     }
 
-    private ComputedValue<FieldConduit<?>> createMixinFieldProvider(final String fieldName,
+    private ComputedValue<FieldConduit<Object>> createMixinFieldProvider(final String fieldName,
             final String mixinClassName)
     {
-        return new ComputedValue<FieldConduit<?>>()
+        return new ComputedValue<FieldConduit<Object>>()
         {
             public FieldConduit get(InstanceContext context)
             {

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java Thu Jul  7 19:34:01 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -20,34 +20,24 @@ import org.apache.tapestry5.internal.Int
 import org.apache.tapestry5.internal.bindings.LiteralBinding;
 import org.apache.tapestry5.ioc.services.FieldValueConduit;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.plastic.FieldConduit;
 import org.apache.tapestry5.runtime.Component;
 
 /**
  * A facade around {@link Binding} and {@link InternalComponentResources} that is used to instrument
- * fields with the {@link Parameter} annotation. Extends {@link FieldValueConduit} so that
+ * fields with the {@link Parameter} annotation. Extends {@link FieldConduit} so that
  * the get() method implicitly coerces the value to the field's type.
  * <p>
- * {@link #get()} will read from the underlying {@link Binding} and used the {@link TypeCoercer} coerce the value to the
+ * {@link #get(Object, org.apache.tapestry5.plastic.InstanceContext)} will read from the underlying {@link Binding} and used the {@link TypeCoercer} coerce the value to the
  * parameter field's type. get() also includes a null value check (as per {@link Parameter#allowNull()}.
  * <p>
- * {@link #set(Object)} pushes the value into the binding.
+ * {@link #set(Object, org.apache.tapestry5.plastic.InstanceContext, Object)} pushes the value into the binding.
  * 
  * @since 5.2.0
  */
-public interface ParameterConduit extends FieldValueConduit
+public interface ParameterConduit extends FieldConduit<Object>
 {
     /**
-     * Sets the default value for the parameter based on either the current value of the field,
-     * or on result from a default method. This is only used if the parameter is not otherwise
-     * bound.
-     * 
-     * @param defaultValue
-     *            an object (which will be wrapped as a {@link LiteralBinding}, or
-     *            a {@link Binding} instance
-     */
-    void setDefault(Object defaultValue);
-
-    /**
      * Determines if the parameter is actually bound.
      * 
      * @return true if bound

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java Thu Jul  7 19:34:01 2011
@@ -14,11 +14,10 @@
 
 package org.apache.tapestry5.internal.transform;
 
-import java.util.List;
-
 import org.apache.tapestry5.Binding;
-import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.Parameter;
+import org.apache.tapestry5.func.F;
+import org.apache.tapestry5.func.Flow;
 import org.apache.tapestry5.func.Predicate;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.bindings.LiteralBinding;
@@ -29,48 +28,24 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
 import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.plastic.*;
 import org.apache.tapestry5.services.BindingSource;
-import org.apache.tapestry5.services.ClassTransformation;
-import org.apache.tapestry5.services.ComponentClassTransformWorker;
 import org.apache.tapestry5.services.ComponentDefaultProvider;
-import org.apache.tapestry5.services.ComponentMethodAdvice;
-import org.apache.tapestry5.services.ComponentMethodInvocation;
-import org.apache.tapestry5.services.ComponentValueProvider;
-import org.apache.tapestry5.services.FieldAccess;
-import org.apache.tapestry5.services.MethodAccess;
-import org.apache.tapestry5.services.MethodInvocationResult;
-import org.apache.tapestry5.services.TransformConstants;
-import org.apache.tapestry5.services.TransformField;
-import org.apache.tapestry5.services.TransformMethod;
-import org.apache.tapestry5.services.TransformMethodSignature;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Comparator;
+
 /**
  * Responsible for identifying parameters via the {@link org.apache.tapestry5.annotations.Parameter} annotation on
  * component fields. This is one of the most complex of the transformations.
  */
-public class ParameterWorker implements ComponentClassTransformWorker
+public class ParameterWorker implements ComponentClassTransformWorker2
 {
     private final Logger logger = LoggerFactory.getLogger(ParameterWorker.class);
 
-    private final class InvokeResetOnParameterConduit implements ComponentMethodAdvice
-    {
-        private final FieldAccess conduitAccess;
-
-        private InvokeResetOnParameterConduit(FieldAccess conduitAccess)
-        {
-            this.conduitAccess = conduitAccess;
-        }
-
-        public void advise(ComponentMethodInvocation invocation)
-        {
-            getConduit(invocation, conduitAccess).reset();
-
-            invocation.proceed();
-        }
-    }
-
     /**
      * Contains the per-thread state about a parameter, as stored (using
      * a unique key) in the {@link PerthreadManager}. Externalizing such state
@@ -89,50 +64,6 @@ public class ParameterWorker implements 
         }
     }
 
-    private final class InvokeParameterDefaultMethod implements ComponentMethodAdvice
-    {
-        private final FieldAccess conduitAccess;
-
-        private final MethodAccess defaultMethodAccess;
-
-        private InvokeParameterDefaultMethod(FieldAccess conduitAccess, MethodAccess defaultMethodAccess)
-        {
-            this.conduitAccess = conduitAccess;
-            this.defaultMethodAccess = defaultMethodAccess;
-        }
-
-        public void advise(ComponentMethodInvocation invocation)
-        {
-            logger.debug(String.format("%s invoking default method %s", invocation.getComponentResources()
-                    .getCompleteId(), defaultMethodAccess));
-
-            MethodInvocationResult result = defaultMethodAccess.invoke(invocation.getInstance());
-
-            result.rethrow();
-
-            getConduit(invocation, conduitAccess).setDefault(result.getReturnValue());
-
-            invocation.proceed();
-        }
-    }
-
-    private final class InvokeLoadOnParmeterConduit implements ComponentMethodAdvice
-    {
-        private final FieldAccess conduitAccess;
-
-        private InvokeLoadOnParmeterConduit(FieldAccess conduitAccess)
-        {
-            this.conduitAccess = conduitAccess;
-        }
-
-        public void advise(ComponentMethodInvocation invocation)
-        {
-            getConduit(invocation, conduitAccess).load();
-
-            invocation.proceed();
-        }
-    }
-
     private final ComponentClassCache classCache;
 
     private final BindingSource bindingSource;
@@ -144,7 +75,7 @@ public class ParameterWorker implements 
     private final PerthreadManager perThreadManager;
 
     public ParameterWorker(ComponentClassCache classCache, BindingSource bindingSource,
-            ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer, PerthreadManager perThreadManager)
+                           ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer, PerthreadManager perThreadManager)
     {
         this.classCache = classCache;
         this.bindingSource = bindingSource;
@@ -153,41 +84,39 @@ public class ParameterWorker implements 
         this.perThreadManager = perThreadManager;
     }
 
-    public void transform(ClassTransformation transformation, MutableComponentModel model)
-    {
-        transformFields(transformation, model, true);
-        transformFields(transformation, model, false);
-    }
-
-    private void transformFields(ClassTransformation transformation, MutableComponentModel model, boolean principal)
+    private final Comparator<PlasticField> byPrincipalThenName = new Comparator<PlasticField>()
     {
-        for (TransformField field : matchParameterFields(transformation, principal))
+        public int compare(PlasticField o1, PlasticField o2)
         {
-            convertFieldIntoParameter(transformation, model, field);
-        }
-    }
+            boolean principal1 = o1.getAnnotation(Parameter.class).principal();
+            boolean principal2 = o2.getAnnotation(Parameter.class).principal();
 
-    private List<TransformField> matchParameterFields(ClassTransformation transformation, final boolean principal)
-    {
-        Predicate<TransformField> predicate = new Predicate<TransformField>()
-        {
-            public boolean accept(TransformField field)
+            if (principal1 == principal2)
             {
-                Parameter annotation = field.getAnnotation(Parameter.class);
-
-                return annotation != null && annotation.principal() == principal;
+                return o1.getName().compareTo(o2.getName());
             }
-        };
 
-        return transformation.matchFields(predicate);
+            return principal1 ? -1 : 1;
+        }
+    };
+
+
+    public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
+    {
+        Flow<PlasticField> parametersFields = F.flow(plasticClass.getFieldsWithAnnotation(Parameter.class)).sort(byPrincipalThenName);
+
+        for (PlasticField field : parametersFields)
+        {
+            convertFieldIntoParameter(plasticClass, model, field);
+        }
     }
 
-    private void convertFieldIntoParameter(ClassTransformation transformation, MutableComponentModel model,
-            TransformField field)
+    private void convertFieldIntoParameter(PlasticClass plasticClass, MutableComponentModel model,
+                                           PlasticField field)
     {
         Parameter annotation = field.getAnnotation(Parameter.class);
 
-        String fieldType = field.getType();
+        String fieldType = field.getTypeName();
 
         String parameterName = getParameterName(field.getName(), annotation.name());
 
@@ -196,53 +125,46 @@ public class ParameterWorker implements 
         model.addParameter(parameterName, annotation.required(), annotation.allowNull(), annotation.defaultPrefix(),
                 annotation.cache());
 
-        ComponentValueProvider<ParameterConduit> provider = createParameterConduitProvider(parameterName, fieldType,
-                annotation);
-
-        TransformField conduitField = transformation.addIndirectInjectedField(ParameterConduit.class, parameterName
-                + "$conduit", provider);
-
-        FieldAccess conduitAccess = conduitField.getAccess();
-
-        addCodeForParameterDefaultMethod(transformation, parameterName, conduitAccess);
+        MethodHandle defaultMethodHandle = findDefaultMethodHandle(plasticClass, parameterName);
 
-        field.replaceAccess(conduitField);
+        ComputedValue<FieldConduit<Object>> computedParameterConduit = createComputedParameterConduit(parameterName, fieldType,
+                annotation, defaultMethodHandle);
 
-        invokeLoadOnParameterConduitAtPageLoad(transformation, conduitAccess);
-
-        invokeResetOnParameterConduitAtPostRenderCleanup(transformation, conduitAccess);
+        field.setComputedConduit(computedParameterConduit);
     }
 
-    private void invokeResetOnParameterConduitAtPostRenderCleanup(ClassTransformation transformation,
-            final FieldAccess conduitAccess)
+
+    private MethodHandle findDefaultMethodHandle(PlasticClass plasticClass, String parameterName)
     {
-        ComponentMethodAdvice advice = new InvokeResetOnParameterConduit(conduitAccess);
+        final String methodName = "default" + parameterName;
 
-        addMethodAdvice(transformation, TransformConstants.POST_RENDER_CLEANUP_SIGNATURE, advice);
-    }
+        Predicate<PlasticMethod> predicate = new Predicate<PlasticMethod>()
+        {
+            public boolean accept(PlasticMethod method)
+            {
+                return method.getDescription().argumentTypes.length == 0
+                        && method.getDescription().methodName.equalsIgnoreCase(methodName);
+            }
+        };
 
-    private void addMethodAdvice(ClassTransformation transformation, TransformMethodSignature methodSignature,
-            ComponentMethodAdvice advice)
-    {
-        transformation.getOrCreateMethod(methodSignature).addAdvice(advice);
-    }
+        Flow<PlasticMethod> matches = F.flow(plasticClass.getMethods()).filter(predicate);
 
-    private void invokeLoadOnParameterConduitAtPageLoad(ClassTransformation transformation, FieldAccess conduitAccess)
-    {
-        ComponentMethodAdvice pageLoadAdvice = new InvokeLoadOnParmeterConduit(conduitAccess);
+        // This will match exactly 0 or 1 (unless the user does something really silly)
+        // methods, and if it matches, we know the name of the method.
 
-        addPageLoadAdvice(transformation, pageLoadAdvice);
+        return matches.isEmpty() ? null : matches.first().getHandle();
     }
 
     @SuppressWarnings("all")
-    private ComponentValueProvider<ParameterConduit> createParameterConduitProvider(final String parameterName,
-            final String fieldTypeName, final Parameter annotation)
+    private ComputedValue<FieldConduit<Object>> createComputedParameterConduit(final String parameterName,
+                                                                               final String fieldTypeName, final Parameter annotation,
+                                                                               final MethodHandle defaultMethodHandle)
     {
-        return new ComponentValueProvider<ParameterConduit>()
+        return new ComputedValue<FieldConduit<Object>>()
         {
-            public ParameterConduit get(ComponentResources resources)
+            public ParameterConduit get(InstanceContext context)
             {
-                final InternalComponentResources icr = (InternalComponentResources) resources;
+                final InternalComponentResources icr = context.get(InternalComponentResources.class);
 
                 final Class fieldType = classCache.forName(fieldTypeName);
 
@@ -290,7 +212,7 @@ public class ParameterWorker implements 
                         return loaded;
                     }
 
-                    public void set(Object newValue)
+                    public void set(Object instance, InstanceContext context, Object newValue)
                     {
                         ParameterState state = getState();
 
@@ -328,8 +250,7 @@ public class ParameterWorker implements 
                             Object boundValue = parameterBinding.get();
 
                             result = typeCoercer.coerce(boundValue, fieldType);
-                        }
-                        catch (RuntimeException ex)
+                        } catch (RuntimeException ex)
                         {
                             throw new TapestryException(String.format(
                                     "Failure reading parameter '%s' of component %s: %s", parameterName,
@@ -337,7 +258,9 @@ public class ParameterWorker implements 
                         }
 
                         if (result != null || annotation.allowNull())
+                        {
                             return result;
+                        }
 
                         throw new TapestryException(
                                 String.format(
@@ -351,15 +274,16 @@ public class ParameterWorker implements 
                         // with no side effects.
 
                         if (parameterBinding == null)
+                        {
                             return;
+                        }
 
                         try
                         {
                             Object coerced = typeCoercer.coerce(newValue, parameterBinding.getBindingType());
 
                             parameterBinding.set(coerced);
-                        }
-                        catch (RuntimeException ex)
+                        } catch (RuntimeException ex)
                         {
                             throw new TapestryException(String.format(
                                     "Failure writing parameter '%s' of component %s: %s", parameterName,
@@ -377,26 +301,37 @@ public class ParameterWorker implements 
 
                     public void load()
                     {
-                        logger.debug(String.format("%s loading parameter %s", icr.getCompleteId(), parameterName));
+                        if (logger.isDebugEnabled())
+                        {
+                            logger.debug(String.format("%s loading parameter %s", icr.getCompleteId(), parameterName));
+                        }
 
                         // If it's bound at this point, that's because of an explicit binding
                         // in the template or @Component annotation.
 
                         if (!icr.isBound(parameterName))
                         {
-                            logger.debug(String.format("%s parameter %s not yet bound", icr.getCompleteId(),
-                                    parameterName));
+                            if (logger.isDebugEnabled())
+                            {
+                                logger.debug(String.format("%s parameter %s not yet bound", icr.getCompleteId(),
+                                        parameterName));
+                            }
 
                             // Otherwise, construct a default binding, or use one provided from
                             // the component.
 
                             Binding binding = getDefaultBindingForParameter();
 
-                            logger.debug(String.format("%s parameter %s bound to default %s", icr.getCompleteId(),
-                                    parameterName, binding));
+                            if (logger.isDebugEnabled())
+                            {
+                                logger.debug(String.format("%s parameter %s bound to default %s", icr.getCompleteId(),
+                                        parameterName, binding));
+                            }
 
                             if (binding != null)
+                            {
                                 icr.bindParameter(parameterName, binding);
+                            }
                         }
 
                         parameterBinding = icr.getBinding(parameterName);
@@ -413,13 +348,19 @@ public class ParameterWorker implements 
                         return parameterBinding != null;
                     }
 
-                    public Object get()
+                    public Object get(Object instance, InstanceContext context)
                     {
-                        if (!isLoaded()) { return defaultValue; }
+                        if (!isLoaded())
+                        {
+                            return defaultValue;
+                        }
 
                         ParameterState state = getState();
 
-                        if (state.cached || !isBound()) { return state.value; }
+                        if (state.cached || !isBound())
+                        {
+                            return state.value;
+                        }
 
                         // Read the parameter's binding and cast it to the
                         // field's type.
@@ -428,8 +369,7 @@ public class ParameterWorker implements 
 
                         // If the value is invariant, we can cache it until at least the end of the request (before
                         // 5.2, it would be cached forever in the pooled instance).
-                        // Otherwise, we
-                        // we may want to cache it for the remainder of the component render (if the
+                        // Otherwise, we we may want to cache it for the remainder of the component render (if the
                         // component is currently rendering).
 
                         if (invariant || (annotation.cache() && icr.isRendering()))
@@ -444,88 +384,68 @@ public class ParameterWorker implements 
                     private Binding getDefaultBindingForParameter()
                     {
                         if (InternalUtils.isNonBlank(annotation.value()))
+                        {
                             return bindingSource.newBinding("default " + parameterName, icr,
                                     annotation.defaultPrefix(), annotation.value());
+                        }
 
                         if (annotation.autoconnect())
+                        {
                             return defaultProvider.defaultBinding(parameterName, icr);
+                        }
 
-                        // Return (if not null) the binding from the setDefault() method which is
-                        // set via a default method on the component, or from the field's initial
-                        // value.
+                        // Invoke the default method and install any value or Binding returned there.
+
+                        invokeDefaultMethod();
 
                         return parameterBinding;
                     }
 
-                    public void setDefault(Object value)
+                    private void invokeDefaultMethod()
                     {
-                        if (value == null)
-                            return;
-
-                        if (value instanceof Binding)
+                        if (defaultMethodHandle == null)
                         {
-                            parameterBinding = (Binding) value;
                             return;
                         }
 
-                        parameterBinding = new LiteralBinding(null, "default " + parameterName, value);
-                    }
-                };
-            }
-        };
-    }
-
-    private ParameterConduit getConduit(ComponentMethodInvocation invocation, FieldAccess access)
-    {
-        return (ParameterConduit) access.read(invocation.getInstance());
-    }
-
-    private void addCodeForParameterDefaultMethod(ClassTransformation transformation, final String parameterName,
-            final FieldAccess conduitAccess)
-    {
-        final String methodName = "default" + parameterName;
-
-        Predicate<TransformMethod> predicate = new Predicate<TransformMethod>()
-        {
-            public boolean accept(TransformMethod method)
-            {
-                return method.getSignature().getParameterTypes().length == 0
-                        && method.getName().equalsIgnoreCase(methodName);
-            }
-        };
-
-        List<TransformMethod> matches = transformation.matchMethods(predicate);
+                        if (logger.isDebugEnabled())
+                        {
+                            logger.debug(String.format("%s invoking method %s to obtain default for parameter %s",
+                                    icr.getCompleteId(), defaultMethodHandle, parameterName));
+                        }
 
-        // This will match exactly 0 or 1 (unless the user does something really silly)
-        // methods, and if it matches, we know the name of the method.
+                        MethodInvocationResult result = defaultMethodHandle.invoke(icr.getComponent());
 
-        if (matches.isEmpty())
-            return;
+                        result.rethrow();
 
-        TransformMethod defaultMethod = matches.get(0);
+                        Object defaultValue = result.getReturnValue();
 
-        captureDefaultValueFromDefaultMethod(transformation, defaultMethod, conduitAccess);
-    }
+                        if (defaultValue == null)
+                        {
+                            return;
+                        }
 
-    private void captureDefaultValueFromDefaultMethod(ClassTransformation transformation,
-            TransformMethod defaultMethod, final FieldAccess conduitAccess)
-    {
-        final MethodAccess access = defaultMethod.getAccess();
+                        if (defaultValue instanceof Binding)
+                        {
+                            parameterBinding = (Binding) defaultValue;
+                            return;
+                        }
 
-        ComponentMethodAdvice advice = new InvokeParameterDefaultMethod(conduitAccess, access);
+                        parameterBinding = new LiteralBinding(null, "default " + parameterName, defaultValue);
+                    }
 
-        addPageLoadAdvice(transformation, advice);
-    }
 
-    private void addPageLoadAdvice(ClassTransformation transformation, ComponentMethodAdvice advice)
-    {
-        addMethodAdvice(transformation, TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, advice);
+                };
+            }
+        };
     }
 
     private static String getParameterName(String fieldName, String annotatedName)
     {
         if (InternalUtils.isNonBlank(annotatedName))
+        {
             return annotatedName;
+        }
 
         return InternalUtils.stripMemberName(fieldName);
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ReadOnlyFieldValueConduit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ReadOnlyFieldValueConduit.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ReadOnlyFieldValueConduit.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ReadOnlyFieldValueConduit.java Thu Jul  7 19:34:01 2011
@@ -24,7 +24,7 @@ import org.apache.tapestry5.plastic.Inst
  *
  * @since 5.2.0
  */
-public abstract class ReadOnlyFieldValueConduit implements FieldConduit
+public abstract class ReadOnlyFieldValueConduit implements FieldConduit<Object>
 {
     private final String qualifiedFieldName;
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java Thu Jul  7 19:34:01 2011
@@ -94,18 +94,18 @@ public final class UnclaimedFieldWorker 
         if (Modifier.isFinal(field.getModifiers()))
             return;
 
-        ComputedValue<FieldConduit<?>> computed = createComputedFieldConduit(field);
+        ComputedValue<FieldConduit<Object>> computed = createComputedFieldConduit(field);
 
         field.setComputedConduit(computed);
     }
 
-    private ComputedValue<FieldConduit<?>> createComputedFieldConduit(PlasticField field)
+    private ComputedValue<FieldConduit<Object>> createComputedFieldConduit(PlasticField field)
     {
         final String fieldType = field.getTypeName();
 
-        return new ComputedValue<FieldConduit<?>>()
+        return new ComputedValue<FieldConduit<Object>>()
         {
-            public FieldConduit<?> get(InstanceContext context)
+            public FieldConduit<Object> get(InstanceContext context)
             {
                 Object fieldDefaultValue = classCache.defaultValueForType(fieldType);
                 InternalComponentResources resources = context.get(InternalComponentResources.class);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/NamedSet.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/NamedSet.java?rev=1143993&r1=1143992&r2=1143993&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/NamedSet.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/NamedSet.java Thu Jul  7 19:34:01 2011
@@ -14,23 +14,24 @@
 
 package org.apache.tapestry5.internal.util;
 
-import java.util.Collections;
-import java.util.Set;
-
 import org.apache.commons.collections.map.CaseInsensitiveMap;
+import org.apache.tapestry5.func.Worker;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 
+import java.util.Collections;
+import java.util.Set;
+
 /**
  * Simple, thread-safe associative array that relates a name to a value. Names are case-insensitive.
  * This is optimized to use less memory (than a {@link CaseInsensitiveMap} (it uses a singly-liked list),
  * though the cost of a lookup is more expensive. However, this is a good match against many of the structures inside
  * a page instance, where most lookups occur only during page constructions, and the number of values is often small.
- * <p>
- * We use simply synchronization, as uncontested synchronized locks are very, very cheap.
- * 
+ * <p/>
+ * We use simple synchronization, as uncontested synchronized locks are very, very cheap.
+ *
  * @param <T>
- *            the type of value stored
+ *         the type of value stored
  */
 public class NamedSet<T>
 {
@@ -89,9 +90,9 @@ public class NamedSet<T>
 
     /**
      * Gets the value for the provided name.
-     * 
+     *
      * @param name
-     *            used to locate the value
+     *         used to locate the value
      * @return the value, or null if not found
      */
     public synchronized T get(String name)
@@ -100,7 +101,10 @@ public class NamedSet<T>
 
         while (cursor != null)
         {
-            if (cursor.name.equalsIgnoreCase(name)) { return cursor.value; }
+            if (cursor.name.equalsIgnoreCase(name))
+            {
+                return cursor.value;
+            }
 
             cursor = cursor.next;
         }
@@ -111,11 +115,11 @@ public class NamedSet<T>
     /**
      * Stores a new value into the set, replacing any previous value with the same name. Name comparisons are case
      * insensitive.
-     * 
+     *
      * @param name
-     *            to store the value. May not be blank.
+     *         to store the value. May not be blank.
      * @param newValue
-     *            non-null value to store
+     *         non-null value to store
      */
     public synchronized void put(String name, T newValue)
     {
@@ -151,12 +155,32 @@ public class NamedSet<T>
     }
 
     /**
+     * Iterates over the values, passing each in turn to the supplied worker.
+     *
+     * @param worker
+     *         performs an operation on, or using, the value
+     */
+    public synchronized void eachValue(Worker<T> worker)
+    {
+        assert worker != null;
+
+        NamedRef<T> cursor = first;
+
+        while (cursor != null)
+        {
+            worker.work(cursor.value);
+            cursor = cursor.next;
+        }
+    }
+
+
+    /**
      * Puts a new value, but only if it does not already exist.
-     * 
+     *
      * @param name
-     *            name to store (comparisons are case insensitive) may not be blank
+     *         name to store (comparisons are case insensitive) may not be blank
      * @param newValue
-     *            non-null value to store
+     *         non-null value to store
      * @return true if value stored, false if name already exists
      */
     public synchronized boolean putIfNew(String name, T newValue)
@@ -169,7 +193,10 @@ public class NamedSet<T>
 
         while (cursor != null)
         {
-            if (cursor.name.equalsIgnoreCase(name)) { return false; }
+            if (cursor.name.equalsIgnoreCase(name))
+            {
+                return false;
+            }
 
             prev = cursor;
             cursor = cursor.next;
@@ -185,7 +212,9 @@ public class NamedSet<T>
         return true;
     }
 
-    /** Convienience method for creating a new, empty set. */
+    /**
+     * Convienience method for creating a new, empty set.
+     */
     public static <T> NamedSet<T> create()
     {
         return new NamedSet<T>();
@@ -193,12 +222,12 @@ public class NamedSet<T>
 
     /**
      * Convienience method for getting a value from a set that may be null.
-     * 
+     *
      * @param <T>
      * @param set
-     *            set to search, may be null
+     *         set to search, may be null
      * @param name
-     *            name to lookup
+     *         name to lookup
      * @return value from set, or null if not found, or if set is null
      */
     public static <T> T get(NamedSet<T> set, String name)
@@ -217,7 +246,9 @@ public class NamedSet<T>
         return set.getNames();
     }
 
-    /** Returns the values in the set, returning an empty set if the NamedSet is null. */
+    /**
+     * Returns the values in the set, returning an empty set if the NamedSet is null.
+     */
     public static <T> Set<T> getValues(NamedSet<T> set)
     {
         if (set == null)