@Override
  public Object before(MethodInvocation methodInvocation) throws Throwable {
    SystemEvent systemEvent = findAnnotation(methodInvocation);

    if (systemEvent == _nullSystemEvent) {
      return null;
    }

    if (systemEvent.action() != SystemEventConstants.ACTION_NONE) {
      if (!isValid(methodInvocation, _PHASE_BEFORE)) {
        return null;
      }

      Object[] arguments = methodInvocation.getArguments();

      ClassedModel classedModel = (ClassedModel) arguments[0];

      SystemEventHierarchyEntry systemEventHierarchyEntry =
          SystemEventHierarchyEntryThreadLocal.push(
              getClassName(classedModel), getClassPK(classedModel), systemEvent.action());

      if (systemEventHierarchyEntry != null) {
        systemEventHierarchyEntry.setUuid(getUuid(classedModel));
      }
    }

    return null;
  }