Type::Registry - a glorified hashref for looking up type constraints
package Foo::Bar; use Type::Registry; my $reg = "Type::Registry"->for_me; # a registry for Foo::Bar # Register all types from Types::Standard $reg->add_types(-Standard); # Register just one type from Types::XSD $reg->add_types(-XSD => ["NonNegativeInteger"]); # Register all types from MyApp::Types $reg->add_types("MyApp::Types"); # Create a type alias $reg->alias_type("NonNegativeInteger" => "Count"); # Look up a type constraint my $type = $reg->lookup("ArrayRef[Count]"); $type->check([1, 2, 3.14159]); # croaks
Alternatively:
package Foo::Bar; use Type::Registry qw( t ); # Register all types from Types::Standard t->add_types(-Standard); # Register just one type from Types::XSD t->add_types(-XSD => ["NonNegativeInteger"]); # Register all types from MyApp::Types t->add_types("MyApp::Types"); # Create a type alias t->alias_type("NonNegativeInteger" => "Count"); # Look up a type constraint my $type = t("ArrayRef[Count]"); $type->check([1, 2, 3.14159]); # croaks
Type::Registry (and Type::Parser) is currently a pretty isolated part of this distribution. It seems like something that would be useful, but it's not heavily integrated with everything else. In particular, if you do:
use Type::Registry qw(t); use Types::Standard -types;
Then the Str, Num, etc keywords imported from Types::Standard will work fine, but t->lookup("Str") and t->lookup("Num") will fail, because importing types from a library does not automatically add them to your registry.
Str
Num
t->lookup("Str")
t->lookup("Num")
Clearly some kind of integration is desirable between Type::Registry and Type::Library, but exactly what form that will take is still to be decided.
So if you decide to use Type::Registry, be aware of its somewhat experimental status. It's not likely to disappear completely, but there may be changes ahead.
A type registry is basically just a hashref mapping type names to type constraint objects.
new
Create a new glorified hashref.
for_class($class)
Create or return the existing glorified hashref associated with the given class.
for_me
Create or return the existing glorified hashref associated with the caller.
add_types(@libraries)
The libraries list is treated as an "optlist" (a la Data::OptList).
Strings are the names of type libraries; if the first character is a hyphen, it is expanded to the "Types::" prefix. If followed by an arrayref, this is the list of types to import from that library. Otherwise, imports all types from the library.
use Type::Registry qw(t); t->add_types(-Standard); # OR: t->add_types("Types::Standard"); t->add_types( -TypeTiny => ['HashLike'], -Standard => ['HashRef' => { -as => 'RealHash' }], );
MooseX::Types (and experimentally, MouseX::Types) libraries can also be added this way, but cannot be followed by an arrayref of types to import.
add_type($type, $name)
The long-awaited singular form of add_types. Given a type constraint object, adds it to the registry with a given name. The name may be omitted, in which case $type->name is called, and Type::Registry will throw an error if $type is anonymous. If a name is explicitly given, Type::Registry cares not one wit whether the type constraint is anonymous.
add_types
$type->name
$type
This method can even add MooseX::Types and MouseX::Types type constraints; indeed anything that can be handled by Types::TypeTiny's to_TypeTiny function. (Bear in mind that to_TypeTiny always results in an anonymous type constraint, so $name will be required.)
to_TypeTiny
$name
alias_type($oldname, $newname)
Create an alias for an existing type.
simple_lookup($name)
Look up a type in the registry by name.
Returns undef if not found.
lookup($name)
Look up by name, with a DSL.
t->lookup("Int|ArrayRef[Int]")
The DSL can be summed up as:
X type from this registry My::Lib::X type from a type library ~X complementary type X | Y union X & Y intersection X[...] parameterized type slurpy X slurpy type Foo::Bar:: class type
Croaks if not found.
AUTOLOAD
Overloaded to call lookup.
lookup
$registry->Str; # like $registry->lookup("Str")
t
This class can export a function t which acts like "Type::Registry"->for_class($importing_class).
"Type::Registry"->for_class($importing_class)
Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=Type-Tiny.
Type::Library.
Toby Inkster <tobyink@cpan.org>.
This software is copyright (c) 2013 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.
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.
To install Type::Tiny, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Type::Tiny
CPAN shell
perl -MCPAN -e shell install Type::Tiny
For more information on module installation, please visit the detailed CPAN module installation guide.