“… - Pull up advice – When all sub‐aspects use the same advice acting on a pointcut declared in the super‐aspect, we can move the advice to the super‐aspect.
- Push down advice – When there is a piece of advice used by only some sub‐aspects, or when each sub‐aspect requires a different advice, we can move the advice to the sub‐aspects that use it.
- Pull up declare parents – When all sub‐aspects use the same declare parents, we can move the declare parents to the super‐aspect.
- Push down declare parents – When a declare parents in a super‐aspect is not relevant to all the sub‐aspects, then we can move the declare parents to the sub‐aspects where it is relevant.
- Pull up inter‐type declaration – If we have an inter‐type declaration that would be best placed in the super‐aspect, then we could move the inter‐type declaration to the super‐aspect.
- Push down inter‐type declaration – If there is an inter‐type declaration that would be best placed in a sub‐aspect, then we can move the inter‐type declaration to the sub‐aspect where it is relevant.
- Pull up pointcut – If all sub‐aspects declare identical pointcuts, then we can move the pointcuts to the super‐aspect.
- Push down pointcut – If there is a pointcut in the super‐aspect that is not used by some sub‐aspects inheriting it, then we can move the pointcut to those sub‐aspects that use it.
- Eliminating borrowed pointcut – when a pointcut is referred by advices of the aspects that are not sub‐aspects.
- Eliminating duplicated pointcut – When pointcuts collect the same set of joinpoints in base code, we can apply this refactoring method to eliminate the duplications.
- Move static introduction – To move a static inter‐type member introduction to a different aspect, we can inline (localize) it from the original aspect into its target types and then extract it into the desired target aspect.
…”