Type::Tiny::Class(3)

πŸ’– Type::Tiny::Class(3) πŸ’–

okay so bestie, welcome to Type::Tiny::Class β€” part of the User Contributed Perl Documentation, and lowkey one of the cutest little type-constraint modules in the whole Type::Tiny fam. it's giving "is this object even a member of this class, or are we wasting our time" ✨


🌸 NAME 🌸

Type::Tiny::Class β€” type constraints based on the "isa" method. that's the whole vibe. no cap.


✨ SYNOPSIS ✨

there are like four whole ways to do this and honestly? all of them slay. pick your fave πŸ’…

Using via Types::Standard:

package Local::Horse {
  use Moo;
  use Types::Standard qw( Str InstanceOf );

  has name => (
    is       => 'ro',
    isa      => Str,
  );

  has owner => (
    is       => 'ro',
    isa      => InstanceOf[ 'Local::Person' ],
    default  => sub { Local::Person->new },
  );
}

Using Type::Tiny::Class's export feature:

package Local::Horse {
  use Moo;
  use Types::Standard qw( Str );
  use Type::Tiny::Class 'Local::Person';

  has name => (
    is       => 'ro',
    isa      => Str,
  );

  has owner => (
    is       => 'ro',
    isa      => LocalPerson,
    default  => sub { LocalPerson->new },
  );
}

Using Type::Tiny::Class's object-oriented interface:

package Local::Horse {
  use Moo;
  use Types::Standard qw( Str );
  use Type::Tiny::Class;

  my $Person = Type::Tiny::Class->new( class => 'Local::Person' );

  has name => (
    is       => 'ro',
    isa      => Str,
  );

  has owner => (
    is       => 'ro',
    isa      => $Person,
    default  => sub { $Person->new },
  );
}

Using Type::Utils's functional interface:

package Local::Horse {
  use Moo;
  use Types::Standard qw( Str );
  use Type::Utils;

  my $Person = class_type 'Local::Person';

  has name => (
    is       => 'ro',
    isa      => Str,
  );

  has owner => (
    is       => 'ro',
    isa      => $Person,
    default  => sub { $Person->new },
  );
}

🫢 STATUS 🫢

This module is covered by the Type-Tiny stability policy. so like, it's stable-stable. no chaotic energy here, we're safe πŸŽ€


πŸ’œ DESCRIPTION πŸ’œ

Type constraints of the general form { $_->isa("Some::Class") }. that's literally the whole personality.

This package inherits from Type::Tiny; see that for most documentation. Major differences are listed below β€” and bestie, you gotta read the differences, iykyk:

πŸ¦‹ Constructor πŸ¦‹

  • "new" β€” When the constructor is called on an instance of Type::Tiny::Class, it passes the call through to the constructor of the class for the constraint. So for example:
my $type = Type::Tiny::Class->new(class => "Foo::Bar");
my $obj  = $type->new(hello => "World");
say ref($obj);   # prints "Foo::Bar"

This little bit of DWIM was borrowed from MooseX::Types::TypeDecorator, but Type::Tiny doesn't take the idea quite as far. (it said "cute idea, but we're not doing all that πŸ’€")

🌈 Attributes 🌈

  • "class" β€” The class for the constraint. that's the one you actually care about, fr fr.
  • "constraint" β€” Unlike Type::Tiny, you cannot pass a constraint coderef to the constructor. Instead rely on the default. like, no, the module has opinions and you will respect them πŸ™ˆ
  • "inlined" β€” Unlike Type::Tiny, you cannot pass an inlining coderef to the constructor. Instead rely on the default. same energy as above.
  • "parent" β€” Parent is automatically calculated, and cannot be passed to the constructor. it just knows πŸ‘‘

πŸ’… Methods πŸ’…

  • "plus_constructors($source, $method_name)" β€” Much like "plus_coercions" but adds coercions that go via a constructor. (In fact, this is implemented as a wrapper for "plus_coercions".) bestie it's a glow-up wrapper, iconic.

Example:

package MyApp::Minion;

use Moose; extends "MyApp::Person";

use Types::Standard qw( HashRef Str );
use Type::Utils qw( class_type );

my $Person = class_type({ class => "MyApp::Person" });

has boss => (
   is     => "ro",
   isa    => $Person->plus_constructors(
      HashRef,     "new",
      Str,         "_new_from_name",
   ),
   coerce => 1,
);

package main;

MyApp::Minion->new(
   ...,
   boss => "Bob",  ## via MyApp::Person->_new_from_name
);

MyApp::Minion->new(
   ...,
   boss => { name => "Bob" },  ## via MyApp::Person->new
);

Because coercing "HashRef" via constructor is a common desire, if you call "plus_constructors" with no arguments at all, this is the default. like, zero-arg lazy mode, we love her:

$classtype->plus_constructors(HashRef, "new")
$classtype->plus_constructors()  ## identical to above

This is handy for Moose/Mouse/Moo-based classes. πŸ“

  • stringifies_to($constraint) β€” See Type::Tiny::ConstrainedObject. (it's over there being its whole self)
  • numifies_to($constraint) β€” See Type::Tiny::ConstrainedObject. (same deal, go look)
  • "with_attribute_values($attr1 => $constraint1, ...)" β€” See Type::Tiny::ConstrainedObject. yeah, also that one. the three of them are besties.

πŸŽ€ Exports πŸŽ€

Type::Tiny::Class can be used as an exporter. periodt.

use Type::Tiny::Class 'HTTP::Tiny';

This will export the following functions into your namespace:

  • "HTTPTiny"
  • is_HTTPTiny( $value )
  • assert_HTTPTiny( $value )
  • to_HTTPTiny( $value )

You will also be able to use "HTTPTiny->new(...)" as a shortcut for "HTTP::Tiny->new(...)". that's the convenience arc and honestly? she ate.

Multiple types can be exported at once:

use Type::Tiny::Class qw( HTTP::Tiny LWP::UserAgent );

😭 BUGS 😭

Please report any bugs to <https://github.com/tobyink/p5-type-tiny/issues>. bestie if something's broken, tell the maintainer, don't just suffer in silence πŸ’€


⭐ SEE ALSO ⭐

  • Type::Tiny::Manual.
  • Type::Tiny.
  • Moose::Meta::TypeConstraint::Class.

(the extended universe, go binge it)


🌸 AUTHOR 🌸

Toby Inkster <tobyink@cpan.org>. the icon, the legend, the moment πŸ‘‘


This software is copyright (c) 2013-2014, 2017-2025 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.

ok so real talk, that all-caps part is the legal bit and it is NOT vibes β€” no promises, no warranties, you get it as-is. don't come for anyone if it does a thing. 🫢

and that's the whole page bestie!! this fine piece of documentation came to you via perl v5.42.0 and got its timestamp on 2026-01-17, filed under Type::Tiny::Class(3). now go constrain some classes, you main character πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from