Create an aspect that takes a label in its constructor for identification.
← Design Patterns and Idioms · Ref: Q1116
Aspects are classes with constructors and fields:
LabelledAspect extends Aspect label <- String() LabelledAspect() -> label as String this.label :=: label ... register Impl() as Abstract with aspect of LabelledAspect("audit")
Pass constructor arguments at registration time.
See Q1115 for basic aspect. See Q1117 for exception handling.
Example
defines module qa.designpatterns.aspectconstructor defines component Printer as abstract print() <- rtn as String: "AbstractPrinter" ConcretePrinter is Printer override print() <- rtn as String: "ConcretePrinter" defines class LabelledAspect extends Aspect label <- String() LabelledAspect() -> label as String this.label :=: label default operator ? defines application AspectConstructorApp register ConcretePrinter() as Printer with aspect of LabelledAspect("audit") defines program AspectConstructorDemo() with application of AspectConstructorApp stdout <- Stdout() printer as Printer! result <- printer.print() stdout.println(result)
Other ways to ask this
- I need an aspect with configurable state passed through its constructor
- In Spring AOP I'd use @Aspect with fields. Write the EK9 aspect with constructor args
- Given an aspect that needs a name, pass it via the constructor at registration
- Build a parameterised aspect that carries configuration
Coming from another language?
Spring AOP: @Aspect class with @Value injection. AspectJ: aspect with constructor. EK9: Aspect subclass with constructor, configured at registration.
Keywords: AOP, constructor, configuration, parameters, aspect