Synopsis
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 .
Description
Type constraints of the general form
{ $_->isa("Some::Class") }
.
This package inherits from Type::Tiny ; see that for most documentation. Major differences are listed below:
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.
Attributes
-
class
-
The class for the constraint.
-
constraint
-
Unlike Type::Tiny, you cannot pass a constraint coderef to the constructor. Instead rely on the default.
-
inlined
-
Unlike Type::Tiny, you cannot pass an inlining coderef to the constructor. Instead rely on the default.
-
parent
-
Parent is automatically calculated, and cannot be passed to the constructor.
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 forplus_coercions
.)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 callplus_constructors
with no arguments at all, this is the default.$classtype->plus_constructors(HashRef, "new") $classtype->plus_constructors() ## identical to above
This is handy for Moose/Mouse/Moo-based classes.
-
stringifies_to($constraint)
-
numifies_to($constraint)
-
with_attribute_values($attr1 => $constraint1, ...)
Exports
Type::Tiny::Class can be used as an exporter.
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(...)
.
Multiple types can be exported at once:
use Type::Tiny::Class qw( HTTP::Tiny LWP::UserAgent );