Release v0.9.0
@AsenaJs/asena 0.8.1 → 0.9.0 (minor). Full detail in CHANGELOG.md.
Decorator inheritance. Method-level decorators write their metadata to the class where the method is declared, but the readers did not walk the prototype chain. @Get/@Post/… and @page were read with getOwnMetadata, so a route declared on a base class was never registered — no error, no log line. @on, @MessagePattern and @EventPattern were read with getMetadata, which returns the nearest ancestor's record whole, so a single handler on the subclass silently discarded every handler it inherited.
The rule is now the one Spring and JAX-RS §3.6 use:
What changes the behaviour of a request travels with the route. What says where the route lives, or what a class is, belongs to the concrete class.
Component decorators (@controller, @service, …) are still not inherited, and an undecorated subclass of a component is no longer registered at all.
onNotFound. An unmatched route is a routing outcome, not a thrown error, so it no longer reaches onError as a synthetic one. NotFoundError is removed.
HttpException branding (isHttpException) that survives two resolved copies of a package, where instanceof silently answers false — which turned every deliberate 401/403 into a 500.