...
In Tapestry, every component (and remember, pages are components) has meta data: an extra set of key/value pairs stored in the component's CompnentResources ComponentResources.
By hooking into the component class transformation pipeline, we can change an annotation into meta-data that can be accessed by a filter.
...
The work we ultimately want to do occurs when rendering a page. Tapestry defines a pipeline for that overall process. The point of a pipeline is that we can add filters to it. We'll add a filter that checks for the meta-data key and adds the response header and JavaScript.
...
That's it: with the above code, simply adding the @ForbidFraming annotation to a page will add the response header and associated JavaScript; no inheritance hasselshassles. This basic pattern can be applied to a wide range of cross-cutting concerns, such as security, transaction management, logging, or virtually any other kind of situation that would normally be solved with inheritance or ugly boilerplate code.
...