# Summary

So now that we mapped our self binding aspect, let's clean up our code further:

```javascript
component name="UserService"{

    function save() transactional{
        // do some work here
    }
}
```

Now isn't this amazing! We are back to our original business logic and code with no extra fluff around logging, transactions and pretty much just code noise. Now we are talking and cooking with AOP. So hopefully by now you nave a good grasp of what AOP does for you and how to implement it in WireBox. So here are the steps to remind you:

1. Create an aspect that implements: `wirebox.system.aop.MethodInterceptor`
2. Map the aspect in your WireBox binder via the `mapAspect()` method
3. Bind the aspect to classes and methods via annotations or the `bindAspect()` method

So, easy as 1-2-3! AOP is powerful and extermely flexible. Hopefully, your imagination is now going into overdrive and coming up with ways to not only clean up your code from cross cutting concerns, but also help you do things like:

* threaded methods
* transform method results
* method auditing
* method security
* cache method results
* etc.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wirebox.ortusbooks.com/aspect-oriented-programming/aop-intro/summary.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
