Hello,
I'm trying to write a new Foreach component that allows you to safely add/remove entries from the provided list of objects during the rewind cycle (to make it easier to create pages such as the todo listing show in "Tapestry in Action"). I do this by caching the list during the render cycle so that the same elements will be used during rewind. I got it to work fine when it appears only once in a page, however, In order to make this work with when it appears more than once in a page or nested inside another Foreach component, I found that had to extend AbstractFormComponent instead of BaseComponent, since I can then obtain a unique ID for each occurrence. Once I did that, I started to get this exception: org.apache.tapestry.ApplicationRuntimeException Method 'public abstract java.lang.String org.apache.tapestry.form.AbstractFormComponent.getName()' (declared in class org.apache.tapestry.form.AbstractFormComponent) has no implementation in class app.internal.component.form.SafeForeach (or enhanced subclass app.internal.component.form.SafeForeach$Enhance_73). If I create do-nothing get/setName methods, Tapestry is satisfied and starts asking for the implementation of isDisabled() and after that for the implementation of getForm(). I'm afraid it's asking for every abstract method present in AbstractFormComponent. Shouldn't Tapestry automatically create them in the enhanced subclass? I looked at code from various other form components and I couldn't find out what is it I'm doing wrong. I'm pretty sure Tapestry does not require the component class to implement these methods. This is not the first form component I've written, but it's the first one that gave me trouble. I'm using Tapestry 3.0.3 (but I had the same problem in 3.0.2). Here's some of the stack trace in case it might be useful: Stack Trace: * org.apache.tapestry.enhance.DefaultComponentClassEnhancer.validateEnhancedCl ass(DefaultComponentClassEnhancer.java:203) * org.apache.tapestry.enhance.DefaultComponentClassEnhancer.constructComponent Class(DefaultComponentClassEnhancer.java:146) * org.apache.tapestry.enhance.DefaultComponentClassEnhancer.getEnhancedClass(D efaultComponentClassEnhancer.java:97) * org.apache.tapestry.pageload.PageLoader.instantiateComponent(PageLoader.java :603) * org.apache.tapestry.pageload.PageLoader.createImplicitComponent(PageLoader.j ava:569) * org.apache.tapestry.BaseComponentTemplateLoader.createImplicitComponent(Base ComponentTemplateLoader.java:295) * org.apache.tapestry.BaseComponentTemplateLoader.process(BaseComponentTemplat eLoader.java:237) * org.apache.tapestry.BaseComponentTemplateLoader.process(BaseComponentTemplat eLoader.java:172) * org.apache.tapestry.BaseComponent.readTemplate(BaseComponent.java:100) * org.apache.tapestry.BaseComponent.finishLoad(BaseComponent.java:135) * org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:5 19) * org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:764) * org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:152) * org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:195) Any ideas? Denis Souza