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

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

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

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

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

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

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

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