/*
 * 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.enums;

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

/**
 * Broken Operator enumeration, getEnumClass() not superclass.
 *
 * @author Apache Software Foundation
 * @version $Id$
 */
public abstract class Broken2OperationEnum 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 Broken2OperationEnum PLUS = new PlusOperation();
    private static class PlusOperation extends Broken2OperationEnum {
        private PlusOperation() {
            super("Plus");
        }
        public int eval(int a, int b) {
            return (a + b);
        }
    }
    public static final Broken2OperationEnum MINUS = new MinusOperation();
    private static class MinusOperation extends Broken2OperationEnum {
        private MinusOperation() {
            super("Minus");
        }
        public int eval(int a, int b) {
            return (a - b);
        }
    }

    private Broken2OperationEnum(String name) {
        super(name);
    }
    
    public final Class getEnumClass() {
        return ColorEnum.class;
    }

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

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

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

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

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