NAME

    Class::Type::Enum - Build Enum-like classes

VERSION

    version 0.001

SYNOPSIS

      package Toast::Status {
        use Class::Type::Enum values => ['bread', 'toasting', 'toast', 'burnt'];
      }
    
      package Toast {
        use Moo;
    
        has status => (
          is     => 'rw',
          isa    => Toast::Status->get_test,
          coerce => Toast::Status->get_coerce,
        );
      }
    
      my @toast = map { Toast->new(status => $_) } qw( toast burnt bread bread toasting toast );
    
      my @trashcan = grep { $_->status->is_burnt } @toast;
      my @plate    = grep { $_->status->is_toast } @toast;
    
      my $ready_status   = Toast::Status->new('toast');
      my @eventual_toast = grep { $_->status < $ready_status } @toast;
    
      # or:
    
      @eventual_toast = grep { $_->status->none('toast', 'burnt') } @toast;

DESCRIPTION

    Class::Type::Enum is a class builder for type-like classes to represent
    your enumerated values. In particular, it was built to scratch an itch
    with DBIx::Class value inflation.

    I wouldn't consider the interface stable yet; I'd love feedback on this
    dist.

    When useing Class::Type::Enum:

      * Required:

      values => [@symbols]

	The list of symbolic values in your enum, in ascending order if
	relevant.

      * Optional

      init => $integer // 0

	If provided, the ordinal values of your enum will begin with the
	init value.

      bits => $bool // !!0

	If true, each ordinal will be an increasing power of two, rather
	than increments. That is, with this set, your enum's ordinal values
	will be 1, 2, 4, 8, 16, ... which can be handy for bit fields.

METHODS

 $class->import(values => [], ...)

    Sets up the consuming class as a subclass of Class::Type::Enum and
    installs functions that are unique to the class.

 $class->new($value)

    Your basic constructor, expects only a value corresponding to a symbol
    in the enum type.

 $class->inflate_value($value)

    Does the actual work of $class->new($value), also used when inflating
    values for DBIx::Class::InflateColumn::ClassTypeEnum.

 $class->inflate($ord)

    Used when inflating ordinal values for
    DBIx::Class::InflateColumn::ClassTypeEnum or if you need to work with
    ordinals directly.

 $class->values_ord

    Returns a hashref with symbols as keys and ordinals as values.

 $class->ord_values

    Returns a hashref with ordinals as keys and symbols as values.

 $class->values

    Returns an arrayref of valid symbolic values in order.

 $class->get_test

    Returns a function which either returns true if it's passed a valid
    value for the enum, or throws an exception.

 $class->test($value)

    A helper for directly using $class->get_test.

      Toast::Status->test('deleted')   # throws an exception

 $class->get_coerce

    Returns a function which returns an enum if given an enum, or tries to
    create an enum from the given value using $class->new($value).

    TODO: test and coerce don't work with ordinals

 $o->is($value)

    Given a test value, returns true or false if the enum instance's value
    is equal to the test value.

    An exception is thrown if an invalid test value is given.

 $o->is_$value

    Shortcut for $o->is($value)

 $o->stringify

    Returns the symbolic value.

 $o->numify

    Returns the ordinal value.

 $o->any(@cases)

    True if $o->is(..) for any of the given cases.

 $o->none(@cases)

    True if $o->is(..) for none of the given cases.

SEE ALSO

      * Object::Enum

      * Class::Enum

      * Enumeration

AUTHOR

    Meredith Howard <mhoward@cpan.org>

COPYRIGHT AND LICENSE

    This software is copyright (c) 2015 by Meredith Howard.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

