# NAME

List::Objects::Types - Type::Tiny-based types for List::Objects::WithUtils

# SYNOPSIS

    package Foo;

    use List::Objects::Types -all;
    use List::Objects::WithUtils;
    use Moo 2;  # version 2+ for better Type::Tiny support

    has my_array => (
      is  => 'ro',
      isa => ArrayObj,
      default => sub { array }
    );

    has static_array => (
      is  => 'ro',
      isa => ImmutableArray,
      coerce  => 1,
      default => sub { [qw/ foo bar /] }
    );

    has my_hash => (
      is  => 'ro',
      isa => HashObj,
      coerce  => 1,
      # Coercible from a plain HASH:
      default => sub { +{} }
    );

    use Types::Standard 'Int', 'Num';
    has my_ints => (
      is  => 'ro',
      # Nums added to this array_of(Int) are coerced to Ints:
      isa => TypedArray[ Int->plus_coercions(Num, 'int($_)') ],
      coerce  => 1,
      default => sub { [1, 2, 3.14] }
    );

# DESCRIPTION

A set of [Type::Tiny](https://metacpan.org/pod/Type::Tiny)-based types & coercions matching the list objects found
in [List::Objects::WithUtils](https://metacpan.org/pod/List::Objects::WithUtils).

### ArrayObj

An object that consumes [List::Objects::WithUtils::Role::Array](https://metacpan.org/pod/List::Objects::WithUtils::Role::Array).

Can be coerced from a plain ARRAY; a shallow copy is performed.

### HashObj

An object that consumes [List::Objects::WithUtils::Role::Hash](https://metacpan.org/pod/List::Objects::WithUtils::Role::Hash).

Can be coerced from a plain HASH; a shallow copy is performed.

### ImmutableArray

An object that consumes [List::Objects::WithUtils::Role::Array::Immutable](https://metacpan.org/pod/List::Objects::WithUtils::Role::Array::Immutable).

Can be coerced from a plain ARRAY or an ["ArrayObj"](#arrayobj); a shallow copy is performed.

### TypedArray

An object that consumes [List::Objects::WithUtils::Role::Array::Typed](https://metacpan.org/pod/List::Objects::WithUtils::Role::Array::Typed).

Not coercible.

### TypedArray\[\`a\]

TypedArray can be parameterized with another type constraint specifying the
type of its values. 

Can be coerced from a plain ARRAY or an ["ArrayObj"](#arrayobj); a shallow copy is
performed. If the parameter also has a coercion, this will be applied
to each item in the new array.

In versions prior to `v2.x`, subtypes were permitted; `TypedArray[Num]`
would accept `array_of(Num, 1, 2, 3.14)` as expected, but also `array_of(Int, 1, 2, 3)` as `Int` is a subtype `Num`. This could lead to
unexpected behavior. As of `v2.1.1`, this has been corrected; the latter
would be rejected without an appropriate coercion (for example, specifying `coerce => 1` in a Moo(se) attribute along these lines will coerce the
`Int`-typed array object to `Num`)

(The `examples/` directory that comes with this distribution contains some
examples of parameterized & coercible TypedArrays.)

### ImmutableTypedArray

An object that isa [List::Objects::WithUtils::Array::Immutable::Typed](https://metacpan.org/pod/List::Objects::WithUtils::Array::Immutable::Typed).

Not coercible.

### ImmutableTypedArray\[\`a\]

ImmutableTypedArray can be parameterized with another type constraint, like
["TypedArray"](#typedarray) (however unlike its mutable counterpart, subtypes are
accepted).

Can be coerced from a plain ARRAY or an ["ArrayObj"](#arrayobj).

### TypedHash

An object that consumes [List::Objects::WithUtils::Role::Hash::Typed](https://metacpan.org/pod/List::Objects::WithUtils::Role::Hash::Typed).

Not coercible.

### TypedHash\[\`a\]

TypedHash can be parameterized with another type constraint, like
["TypedArray"](#typedarray).

Can be coerced from a plain HASH or a ["HashObj"](#hashobj). If the parameter also has a
coercion, this will be applied to each value in the new hash.

### ImmutableTypedHash

An object that isa [List::Objects::WithUtils::Hash::Immutable::Typed](https://metacpan.org/pod/List::Objects::WithUtils::Hash::Immutable::Typed).

Not coercible.

### ImmutableTypedHash\[\`a\]

ImmutableTypedHash can be parameterized with another type constraint, like
["TypedHash"](#typedhash).

Can be coerced from a plain HASH or an ["HashObj"](#hashobj).

### InflatedHash

An object that isa [List::Objects::WithUtils::Hash::Inflated](https://metacpan.org/pod/List::Objects::WithUtils::Hash::Inflated).

Can be coerced from a plain HASH or an ["HashObj"](#hashobj).

(Available from v1.2.1)

### InflatedHash\[\`a\]

InflatedHash can be parameterized with a list of methods expected to be
available.

(Available from v1.3.1)

## SEE ALSO

[MoopsX::ListObjects](https://metacpan.org/pod/MoopsX::ListObjects) for integration with [Moops](https://metacpan.org/pod/Moops) class-building sugar.

[List::Objects::WithUtils](https://metacpan.org/pod/List::Objects::WithUtils) for more on the relevant list objects.

[Type::Tiny](https://metacpan.org/pod/Type::Tiny) for more on type methods & overloads.

[Types::Standard](https://metacpan.org/pod/Types::Standard) for a set of useful base types.

[Type::Library](https://metacpan.org/pod/Type::Library) for details on importing types.

# AUTHOR

Jon Portnoy <avenj@cobaltirc.org> with significant contributions from Toby
Inkster (CPAN: TOBYINK)