Generate the choices as required by Django models.

        Parameters
        ----------
        order : str
            in which the elements should be returned. Possible values are:
            * 'sorted', the elements will be sorted by `value`
            * 'reverse', the elements will be sorted by `value` as if each comparison were 
                reversed
            * 'natural' (default), the elements are ordered as when instantiated in the enumeration
                
        Returns
        -------
        iterable of tuple

def choices(cls, order='natural'):
        """
        Generate the choices as required by Django models.

        Parameters
        ----------
        order : str
            in which the elements should be returned. Possible values are:
            * 'sorted', the elements will be sorted by `value`
            * 'reverse', the elements will be sorted by `value` as if each comparison were 
                reversed
            * 'natural' (default), the elements are ordered as when instantiated in the enumeration
                
        Returns
        -------
        iterable of tuple

        """
        INC, DEC, NAT = 'sorted', 'reverse', 'natural'
        options = [INC, DEC, NAT]
        assert order in options, "Sorting order not recognized: {}. Available options are: {}".format(order, options)
        if order in [INC, DEC]:
            reverse = order == DEC
            if reverse:
                attr = '__choices_reverse_'
            else:
                attr = '__choices_sorted_'
            if not hasattr(cls, attr):
                setattr(cls, attr, tuple([(c.value, c.label) for c in sorted(list(cls), reverse=reverse)]))
            return getattr(cls, attr)
        else:
            return super(EOrderedChoice, cls).choices()