# phpman > perldoc > Type::Tiny::Manual::UsingWithMouse

## NAME
    [Type::Tiny::Manual::UsingWithMouse](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AManual%3A%3AUsingWithMouse/markdown) - how to use [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) with Mouse

## MANUAL
    First read [Type::Tiny::Manual::Moo](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AManual%3A%3AMoo/markdown), [Type::Tiny::Manual::Moo2](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AManual%3A%3AMoo2/markdown), and [Type::Tiny::Manual::Moo3](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny%3A%3AManual%3A%3AMoo3/markdown).
    Everything in those parts of the manual should work exactly the same in Mouse.

    This part of the manual will focus on Mouse-specifics.

    Overall, [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) is less well-tested with Mouse than it is with Moose and Moo, but there are
    still a good number of test cases for using [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) with Mouse, and there are no known major
    issues with [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown)'s Mouse support.

  Why Use [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) At All?
    Mouse does have a built-in type constraint system which is fairly convenient to use, but there
    are several reasons you should consider using [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) instead.

    *   [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) provides helpful methods like "where" and "plus_coercions" that allow type
        constraints and coercions to be easily tweaked on a per-attribute basis.

        Something like this is much harder to do with plain Mouse types:

          has name => (
            is      => "ro",
            isa     => Str->plus_coercions(
              ArrayRef[Str], sub { join " ", @$_ },
            ),
            coerce  => 1,
          );

        Mouse tends to encourage defining coercions globally, so if you wanted one Str attribute to
        be able to coerce from ArrayRef[Str], then *all* Str attributes would coerce from
        ArrayRef[Str], and they'd all do that coercion in the same way. (Even if it might make sense
        to join by a space in some places, a comma in others, and a line break in others!)

    *   [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) provides automatic deep coercions, so if type Xyz has a coercion, the following
        should "just work":

          isa xyzlist => ( is => 'ro', isa => ArrayRef[Xyz], coerce => 1 );

    *   [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) offers a wider selection of built-in types.

    *   By using [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown), you can use the same type constraints and coercions for attributes and
        method parameters, in Mouse and non-Mouse code.

### [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown)
    If you've used [Mouse::Util::TypeConstraints](https://www.chedong.com/phpMan.php/perldoc/Mouse%3A%3AUtil%3A%3ATypeConstraints/markdown), you may be accustomed to using a DSL for declaring
    type constraints:

      use [Mouse::Util::TypeConstraints](https://www.chedong.com/phpMan.php/perldoc/Mouse%3A%3AUtil%3A%3ATypeConstraints/markdown);

      subtype 'Natural',
        as 'Int',
        where { $_ > 0 };

    There's a module called [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown) that provides a very similar DSL for declaring types in
    [Type::Library](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ALibrary/markdown)-based type libraries.

      package [My::Types](https://www.chedong.com/phpMan.php/perldoc/My%3A%3ATypes/markdown) {
        use [Type::Library](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ALibrary/markdown) -base;
        use [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown);
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Int );

        declare 'Natural',
          as Int,
          where { $_ > 0 };
      }

    Personally I prefer the more object-oriented way to declare types though.

    In Mouse you might also declare types like this within classes and roles too. Unlike Mouse,
    [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) doesn't keep types in a single global flat namespace, so this doesn't work quite the
    same with [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown). It still creates the type, but it doesn't store it in any type library;
    the type is returned.

      package [My::Class](https://www.chedong.com/phpMan.php/perldoc/My%3A%3AClass/markdown) {
        use Mouse;
        use [Type::Utils](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3AUtils/markdown);
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Int );

        my $Natural =          # store type in a variable
          declare 'Natural',
          as Int,
          where { $_ > 0 };

        has number => ( is => 'ro', isa => $Natural );
      }

    But really, isn't the object-oriented way cleaner?

      package [My::Class](https://www.chedong.com/phpMan.php/perldoc/My%3A%3AClass/markdown) {
        use Mouse;
        use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Int );

        has number => (
          is   => 'ro',
          isa  => Int->where('$_ > 0'),
        );
      }

### [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) and [MouseX::Types](https://www.chedong.com/phpMan.php/perldoc/MouseX%3A%3ATypes/markdown)
    [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) should be a drop-in replacement for [MooseX::Types](https://www.chedong.com/phpMan.php/perldoc/MooseX%3A%3ATypes/markdown). And [Types::Common::Numeric](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3ACommon%3A%3ANumeric/markdown)
    and [Types::Common::String](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3ACommon%3A%3AString/markdown) should easily replace [MouseX::Types::Common::Numeric](https://www.chedong.com/phpMan.php/perldoc/MouseX%3A%3ATypes%3A%3ACommon%3A%3ANumeric/markdown) and
    [MouseX::Types::Common::String](https://www.chedong.com/phpMan.php/perldoc/MouseX%3A%3ATypes%3A%3ACommon%3A%3AString/markdown).

    That said, if you do with to use a mixture of [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) and [MouseX::Types](https://www.chedong.com/phpMan.php/perldoc/MouseX%3A%3ATypes/markdown), they should fit
    together pretty seamlessly.

      use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( ArrayRef );
      use [MouseX::Types::Mouse](https://www.chedong.com/phpMan.php/perldoc/MouseX%3A%3ATypes%3A%3AMouse/markdown) qw( Int );

      # this should just work
      my $list_of_nums = ArrayRef[Int];

      # and this
      my $list_or_num = ArrayRef | Int;

  "-mouse" Import Parameter
    If you have read this far in the manual, you will know that this is the usual way to import type
    constraints:

      use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Int );

    And the "Int" which is imported is a function that takes no arguments and returns the Int type
    constraint, which is a blessed object in the [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) class.

    [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) mocks the [Mouse::Meta::TypeConstraint](https://www.chedong.com/phpMan.php/perldoc/Mouse%3A%3AMeta%3A%3ATypeConstraint/markdown) API so well that most Mouse and MouseX code
    will not be able to tell the difference.

    But what if you need a real [Mouse::Meta::TypeConstraint](https://www.chedong.com/phpMan.php/perldoc/Mouse%3A%3AMeta%3A%3ATypeConstraint/markdown) object?

      use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) -mouse, qw( Int );

    Now the "Int" function imported will return a genuine native Mouse type constraint.

    This flag is mostly a throwback from when [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) native objects *didn't* directly work in
    Mouse. In 99.9% of cases, there is no reason to use it and plenty of reasons not to. (Mouse
    native type constraints don't offer helpful methods like "plus_coercions" and "where".)

  "mouse_type" Method
    Another quick way to get a native Mouse type constraint object from a [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) object is to
    call the "mouse_type" method:

      use [Types::Standard](https://www.chedong.com/phpMan.php/perldoc/Types%3A%3AStandard/markdown) qw( Int );

      my $tiny_type   = Int;
      my $mouse_type  = $tiny_type->mouse_type;

    Internally, this is what the "-mouse" flag makes imported functions do.

### [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) Performance
    [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) should run pretty much as fast as Mouse types do. This is because, when possible, it
    will use Mouse's XS implementations of type checks to do the heavy lifting.

    There are a few type constraints where [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) prefers to do things without Mouse's help
    though, for consistency and correctness. For example, the Mouse XS implementation of Bool is...
    strange... it accepts blessed objects that overload "bool", but only if they return false. If
    they return true, it's a type constraint error.

    Using [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) instead of Mouse's type constraints shouldn't make a significant difference to
    the performance of your code.

## NEXT STEPS
    Here's your next step:

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

        Including how to [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) in your object's "BUILD" method, and third-party shims between
        [Type::Tiny](https://www.chedong.com/phpMan.php/perldoc/Type%3A%3ATiny/markdown) and [Class::Tiny](https://www.chedong.com/phpMan.php/perldoc/Class%3A%3ATiny/markdown).

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

## COPYRIGHT AND LICENCE
    This software is copyright (c) 2013-2014, 2017-2021 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.

