# Type::Tiny::Union - union type constraints - perldoc - [phpMan]

## NAME
    [Type::Tiny::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AUnion/markdown) - union type constraints

## SYNOPSIS
    Using via the "|" operator overload:

      package [Local::Stash](https://www.chedong.com/phpMan.php/perldoc/Local%3A%3AStash/markdown) {
        use Moo;
        use [Types::Common](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3ACommon/markdown) qw( ArrayRef HashRef );

        has data => (
          is   => 'ro',
          isa  => HashRef | ArrayRef,
        );
      }

      my $x = [Local::Stash](https://www.chedong.com/phpMan.php/perldoc/Local%3A%3AStash/markdown)->new( data => {} );  # ok
      my $y = [Local::Stash](https://www.chedong.com/phpMan.php/perldoc/Local%3A%3AStash/markdown)->new( data => [] );  # ok

    Using [Type::Tiny::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AUnion/markdown)'s object-oriented interface:

      package [Local::Stash](https://www.chedong.com/phpMan.php/perldoc/Local%3A%3AStash/markdown) {
        use Moo;
        use [Types::Common](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3ACommon/markdown) qw( ArrayRef HashRef );
        use [Type::Tiny::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AUnion/markdown);

        my $AnyData = [Type::Tiny::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AUnion/markdown)->new(
          name             => 'AnyData',
          type_constraints => [ HashRef, ArrayRef ],
        );

        has data => (
          is   => 'ro',
          isa  => $AnyData,
        );
      }

    Using [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown)'s functional interface:

      package [Local::Stash](https://www.chedong.com/phpMan.php/perldoc/Local%3A%3AStash/markdown) {
        use Moo;
        use [Types::Common](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3ACommon/markdown) qw( ArrayRef HashRef );
        use [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown);

        my $AnyData = union AnyData => [ HashRef, ArrayRef ];

        has data => (
          is   => 'ro',
          isa  => $AnyData,
        );
      }

## STATUS
    This module is covered by the Type-Tiny stability policy.

## DESCRIPTION
    Union type constraints.

    This package inherits from [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown); see that for most documentation. Major differences are
    listed below:

### Constructor
    The "new" constructor from [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) still works, of course. But there is also:

### new_by_overload
        Like the "new" constructor, but will sometimes return another type constraint which is not
        strictly an instance of [Type::Tiny::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AUnion/markdown), but still encapsulates the same meaning. This
        constructor is used by [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown)'s overloading of the "|" operator.

### Attributes
    "type_constraints"
        Arrayref of type constraints.

        When passed to the constructor, if any of the type constraints in the union is itself a
        union type constraint, this is "exploded" into the new union.

    "constraint"
        Unlike [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown), you *cannot* pass a constraint coderef to the constructor. Instead rely
        on the default.

    "inlined"
        Unlike [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown), you *cannot* pass an inlining coderef to the constructor. Instead rely on
        the default.

    "parent"
        Unlike [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown), you *cannot* pass an inlining coderef to the constructor. A parent will
        instead be automatically calculated.

    "coercion"
        You probably do not pass this to the constructor. (It's not currently disallowed, as there
        may be a use for it that I haven't thought of.)

        The auto-generated default will be a [Type::Coercion::Union](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ACoercion%3A%3AUnion/markdown) object.

### Methods
### find_type_for
        Returns the first individual type constraint in the union which $value passes.

### stringifies_to
        See [Type::Tiny::ConstrainedObject](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AConstrainedObject/markdown).

### numifies_to
        See [Type::Tiny::ConstrainedObject](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AConstrainedObject/markdown).

    "with_attribute_values($attr1 => $constraint1, ...)"
        See [Type::Tiny::ConstrainedObject](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AConstrainedObject/markdown).

### Overloading
    *   Arrayrefification calls "type_constraints".

## BUGS
    Please report any bugs to <<https://github.com/tobyink/p5-type-tiny/issues>>.

## SEE ALSO
    [Type::Tiny::Manual](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AManual/markdown).

    [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown).

## AUTHOR
    Toby Inkster <<tobyink@cpan.org>>.

## COPYRIGHT AND LICENCE
    This software is copyright (c) 2013-2014, 2017-2023 by Toby Inkster.

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

## DISCLAIMER OF WARRANTIES
    THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
    WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
    PURPOSE.

