# Type::Tiny::Duck - type constraints based on the "can" method - perldoc - [phpMan]

## NAME
    [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown) - type constraints based on the "can" method

## SYNOPSIS
    Using via [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown):

      package Logger {
        use Moo;
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( HasMethods Bool );

        has debugging => ( is => 'rw', isa => Bool, default => 0 );
        has output    => ( is => 'ro', isa => HasMethods[ 'print' ] );

        sub warn {
          my ( $self, $message ) = @_;
          $self->output->print( "[WARNING] $message\n" );
        }

        sub debug {
          my ( $self, $message ) = @_;
          $self->output->print( "[DEBUG] $message\n" ) if $self->debugging;
        }
      }

    Using [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown)'s export feature:

      package Logger {
        use Moo;
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Bool );
        use [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown) Printable => [ 'print' ];

        has debugging => ( is => 'rw', isa => Bool, default => 0 );
        has output    => ( is => 'ro', isa => Printable );

        sub warn {
          my ( $self, $message ) = @_;
          $self->output->print( "[WARNING] $message\n" );
        }

        sub debug {
          my ( $self, $message ) = @_;
          $self->output->print( "[DEBUG] $message\n" ) if $self->debugging;
        }
      }

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

      package Logger {
        use Moo;
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Bool );
        use [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown);

        my $Printable = [Type::Type::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AType%3A%3ADuck/markdown)->new(
          name    => 'Printable',
          methods => [ 'print' ],
        );

        has debugging => ( is => 'rw', isa => Bool, default => 0 );
        has output    => ( is => 'ro', isa => $Printable );

        sub warn {
          my ( $self, $message ) = @_;
          $self->output->print( "[WARNING] $message\n" );
        }

        sub debug {
          my ( $self, $message ) = @_;
          $self->output->print( "[DEBUG] $message\n" ) if $self->debugging;
        }
      }

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

## DESCRIPTION
    Type constraints of the general form "{ $_->can("method") }".

    The name refers to the saying, "If it looks like a duck, swims like a duck, and quacks like a
    duck, then it probably is a duck". Duck typing can be a more flexible way of testing objects
    than relying on "isa", as it allows people to easily substitute mock objects.

    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:

### Attributes
    "methods"
        An arrayref of method names.

    "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"
        Parent is always [Types::Standard::Object](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard%3A%3AObject/markdown), and cannot be passed to the constructor.

### Methods
### 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).

### Exports
    [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown) can be used as an exporter.

      use [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown) HttpClient => [ 'get', 'post' ];

    This will export the following functions into your namespace:

    "HttpClient"
### is_HttpClient
### assert_HttpClient
### to_HttpClient

    Multiple types can be exported at once:

      use [Type::Tiny::Duck](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3ADuck/markdown) (
        HttpClient   => [ 'get', 'post' ],
        FtpClient    => [ 'upload', 'download' ],
      );

## 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).

    [Moose::Meta::TypeConstraint::DuckType](https://www.chedong.com/phpMan.php/perldoc/Moose%3A%3AMeta%3A%3ATypeConstraint%3A%3ADuckType/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.

