/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.lang.enum;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Broken Operator enumeration, null class.
 *
 * @author Apache Software Foundation
 * @version $Id$
 */
public abstract class Broken1OperationEnum extends Enum {
    // This syntax works for JDK 1.3 and upwards:
//    public static final OperationEnum PLUS = new OperationEnum("Plus") {
//        public int eval(int a, int b) {
//            return (a + b);
//        }
//    };
//    public static final OperationEnum MINUS = new OperationEnum("Minus") {
//        public int eval(int a, int b) {
//            return (a - b);
//        }
//    };
    // This syntax works for JDK 1.2 and upwards:
    public static final Broken1OperationEnum PLUS = new PlusOperation();
    private static class PlusOperation extends Broken1OperationEnum {
        private PlusOperation() {
            super("Plus");
        }
        public int eval(int a, int b) {
            return (a + b);
        }
    }
    public static final Broken1OperationEnum MINUS = new MinusOperation();
    private static class MinusOperation extends Broken1OperationEnum {
        private MinusOperation() {
            super("Minus");
        }
        public int eval(int a, int b) {
            return (a - b);
        }
    }

    private Broken1OperationEnum(String name) {
        super(name);
    }
    
    public final Class getEnumClass() {
        return null;
    }

    public abstract int eval(int a, int b);

    public static Broken1OperationEnum getEnum(String name) {
        return (Broken1OperationEnum) getEnum(Broken1OperationEnum.class, name);
    }

    public static Map getEnumMap() {
        return getEnumMap(Broken1OperationEnum.class);
    }

    public static List getEnumList() {
        return getEnumList(Broken1OperationEnum.class);
    }

    public static Iterator iterator() {
        return iterator(Broken1OperationEnum.class);
    }
}
