Create an aspect that transparently proxies a component's method call.

← Design Patterns and Idioms · Ref: Q1115

Extend Aspect and register with 'with aspect of':

  SilentAspect extends Aspect
    default operator ?
  ...
  register ConcreteComp() as AbstractComp with aspect of SilentAspect()

A silent aspect (no overridden advice) passes all calls through to the real component.

See Q1116 for aspects with constructor args. See Q1117 for exception handling.

Example

defines module qa.designpatterns.aspectbasic

  defines component

    Worker as abstract
      doWork()
        <- rtn as String: "AbstractWorker"

    ConcreteWorker is Worker
      override doWork()
        <- rtn as String: "ConcreteWorker"

  defines class

    SilentAspect extends Aspect
      default operator ?

  defines application

    AspectApp
      register ConcreteWorker() as Worker with aspect of SilentAspect()

  defines program

    AspectBasicDemo() with application of AspectApp
      stdout <- Stdout()
      worker as Worker!
      result <- worker.doWork()
      stdout.println(result)

Common mistakes

E50200 — EK9 has no '@'-annotations — '@Aspect' is parsed as an invalid directive; apply an aspect with 'with aspect of AspectClass()' in the register statement. See ek9 -h E50200 for details.

Incorrect:

      @Aspect register ConcreteWorker() as Worker with aspect of SilentAspect()

Correct:

      register ConcreteWorker() as Worker with aspect of SilentAspect()
Other ways to ask this
  • I need to wrap a component with an aspect that passes calls through unchanged
  • In AspectJ I'd define a pointcut. Write the EK9 basic aspect
  • Given a concrete component, register it with a silent aspect proxy
  • Set up basic aspect delegation where calls pass through to the real component

Coming from another language?

AspectJ: @Aspect + @Around. Spring AOP: @Aspect + @Before/@After. Python: decorators. EK9: extends Aspect + 'with aspect of' in registration.

Keywords: AOP, proxy, delegation, aspect, transparent, wrap