package Mvalve::Types; use Moose; use Moose::Util::TypeConstraints; role_type 'Mvalve::Queue'; role_type 'Mvalve::State'; role_type 'Mvalve::Throttler'; role_type 'Mvalve::Logger'; my $coerce = sub { my $default_class = shift; my $prefix = shift; return sub { my $h = shift; my $module = delete $h->{module} || $default_class; if ($prefix && $module !~ s/^\+//) { $module = join('::', $prefix, $module); } Class::MOP::load_class($module); $module->new(%{$h->{args}}); }; }; *__coerce_throttler = $coerce->('Data::Valve', 'Mvalve::Throttler'); *__coerce_queue = $coerce->('Q4M', 'Mvalve::Queue'); *__coerce_state = $coerce->('Memory', 'Mvalve::State'); *__coerce_logger = $coerce->('Stats', 'Mvalve::Logger'); coerce 'Mvalve::Throttler' => from 'HashRef' => \&__coerce_throttler ; coerce 'Mvalve::Queue' => from 'HashRef' => \&__coerce_queue ; coerce 'Mvalve::State' => from 'HashRef' => \&__coerce_state ; coerce 'Mvalve::Logger' => from 'HashRef' => \&__coerce_logger ; no Moose; 1; __END__ =head1 NAME Mvalve::Types - Mvalve Related Moose Types =head1 SYNOPSIS package MyMvalveModule; use Moose; use Mvalve::Types; has 'foo' => ( is => 'rw', isa => 'Mvalve::Queue' ); =cut