class RequiresParseDetailAspect {


    @Before("this(org.mp4parser.support.AbstractBox) && ((execution(public * * (..)) && !( " +
            "execution(* parseDetails()) || " +
            "execution(* getNumOfBytesToFirstChild()) || " +
            "execution(* getType()) || " +
            "execution(* isParsed()) || " +
            "execution(* getHeader(*)) || " +
            "execution(* parse()) || " +
            "execution(* getBox(*)) || " +
            "execution(* getSize()) || " +
            "execution(* getOffset()) || " +
            "execution(* setOffset(*)) || " +
            "execution(* parseDetails()) || " +
            "execution(* _parseDetails(*)) || " +
            "execution(* parse(*,*,*,*)) || " +
            "execution(* getIsoFile()) || " +
            "execution(* getParent()) || " +
            "execution(* setParent(*)) || " +
            "execution(* getUserType()) || " +
            "execution(* setUserType(*))) && " +
            "!@annotation(org.mp4parser.support.DoNotParseDetail)) || @annotation(org.mp4parser.support.ParseDetail))")
    public void before(JoinPoint joinPoint) {<FILL_FUNCTION_BODY>}


}

      //  System.err.println("JoinPoint");
        if (joinPoint.getTarget() instanceof AbstractBox) {
            if (!((AbstractBox) joinPoint.getTarget()).isParsed()) {
//                System.err.printf("parsed detail %s%n", joinPoint.getTarget().getClass().getSimpleName());
                ((AbstractBox) joinPoint.getTarget()).parseDetails();
            }
        } else {
            throw new RuntimeException("Only methods in subclasses of " + AbstractBox.class.getName() + " can  be annotated with ParseDetail");
        }

    
<no_super_class>