class AnonymousClassDeclarations {

    static class DoFn<I,O> {
        static class ProcessContext {
            public Long innerClassMethod() {}
        }

        enum MyEnum {
            E1, E2, E3
        }

        public void process(ProcessContext context) {}
    }

    static class Transform<I,O> {}

    static class ParDo {
        static <I,O> Transform<I,O> of(DoFn<I,O> doFn) {
            return null;
        }
    }

    void fooBar1() {
        ParDo.of(new DoFn<Integer,Long>() {});
    }

    void fooBar2() {
        ParDo.of(new DoFn<Integer,Long>() {
            public void process(ProcessContext c){
                return c.innerClassMethod();
            }
        });
    }

    void fooBar3() {
        ParDo.of(new DoFn<Integer,Long>() {

            void callAnnonClassInnerMethod() {}

            public void process(ProcessContext c) {
                callAnnonClassInnerMethod();
            }
        });
    }

     void fooBar4() {
        ParDo.of(new DoFn<Integer,Long>() {

            void callAnnonClassInnerMethod() {}

            public void process(ProcessContext c) {
                MyEnum.E3.toString();
            }
        });
    }

    void fooBar5() {
        ParDo.of(new DoFn<Integer,Long>() {

            void callAnnonClassInnerMethod() {}

            enum MyInnerEnum {
                E1, E2, E3
            }
            public void process(ProcessContext c) {
                MyInnerEnum.E3.toString();
            }
        });
    }

}
