//:: # Copyright 2013, Big Switch Networks, Inc.
//:: #
//:: # LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
//:: # the following special exception:
//:: #
//:: # LOXI Exception
//:: #
//:: # As a special exception to the terms of the EPL, you may distribute libraries
//:: # generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
//:: # that copyright and licensing notices generated by LoxiGen are not altered or removed
//:: # from the LoxiGen Libraries and the notice provided below is (i) included in
//:: # the LoxiGen Libraries, if distributed in source code form and (ii) included in any
//:: # documentation for the LoxiGen Libraries, if distributed in binary form.
//:: #
//:: # Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
//:: #
//:: # You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
//:: # a copy of the EPL at:
//:: #
//:: # http::: #www.eclipse.org/legal/epl-v10.html
//:: #
//:: # 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
//:: # EPL for the specific language governing permissions and limitations
//:: # under the EPL.
//::
//:: import itertools
//:: include('_copyright.java')

//:: include('_autogen.java')

package ${package};

//:: include("_imports.java", msg=enum)

public enum ${class_name} {
//:: for i, entry in enumerate(enum.entries):
//::    if enum.metadata.properties:
//::        params = "({})".format(", ".join(type.format_value(value) for (type, value) in entry.constructor_params))
//::    else:
//::        params = ""
//::    #endif
//::    delimiter = ", " if i < len(enum.entries)-1 else ";"
//::    to_string_value = enum.metadata.to_string(entry) if enum.metadata.to_string else None
//::    if to_string_value:
     ${entry.name}${params} {
         @Override
         public String toString() {
            return "${to_string_value}";
         }
     }${delimiter}
//::    else:
     ${entry.name}${params}${delimiter}
//::    #endif
//:: #endfor
//:: if enum.metadata.properties:

//:: for property_metadata in enum.metadata.properties:
     private final ${property_metadata.type.public_type} ${property_metadata.variable_name};
//:: #endfor

     private ${class_name}(${", ".join("{} {}".format(m.type.public_type, m.variable_name) for m in enum.metadata.properties)}) {
     //:: for property_metadata in enum.metadata.properties:
        this.${property_metadata.variable_name} = ${property_metadata.variable_name};
     //:: #endfor
     }
//:: for property_metadata in enum.metadata.properties:

     public ${property_metadata.type.public_type} ${property_metadata.getter_name}() {
         return ${property_metadata.variable_name};
     }
//:: #endfor
//:: #endif
}
