--- /dev/null
+package MooseX::Meta::TypeCoercion::Structured::Optional;
+
+use Moose;
+extends 'Moose::Meta::TypeCoercion';
+
+sub compile_type_coercion {
+ my ($self) = @_;
+ my $constraint = $self->type_constraint->type_parameter;
+
+ $self->_compiled_type_coercion(sub {
+ my ($value) = @_;
+ return unless $constraint->has_coercion;
+ return $constraint->coerce($value);
+ });
+}
+
+sub has_coercion_for_type { 0 }
+
+sub add_type_coercions {
+ Moose->throw_error("Cannot add additional type coercions to Optional types");
+}
+
+__PACKAGE__->meta->make_immutable(inline_constructor => 0);
+
+1;
--- /dev/null
+package MooseX::Meta::TypeConstraint::Structured::Optional;
+
+use Moose;
+use MooseX::Meta::TypeCoercion::Structured::Optional;
+
+extends 'Moose::Meta::TypeConstraint::Parameterizable';
+
+around parameterize => sub {
+ my $orig = shift;
+ my $self = shift;
+
+ my $ret = $self->$orig(@_);
+
+ $ret->coercion(MooseX::Meta::TypeCoercion::Structured::Optional->new(type_constraint => $ret));
+
+ return $ret;
+};
+
+__PACKAGE__->meta->make_immutable(inline_constructor => 0);
+
+1;
use Moose::Util::TypeConstraints;
use MooseX::Meta::TypeConstraint::Structured;
+use MooseX::Meta::TypeConstraint::Structured::Optional;
use MooseX::Types::Structured::OverflowHandler;
use MooseX::Types -declare => [qw(Dict Tuple Optional)];
use Sub::Exporter -setup => { exports => [ qw(Dict Tuple Optional slurpy) ] };
=cut
-my $Optional = Moose::Meta::TypeConstraint::Parameterizable->new(
+my $Optional = MooseX::Meta::TypeConstraint::Structured::Optional->new(
name => 'MooseX::Types::Structured::Optional',
package_defined_in => __PACKAGE__,
parent => find_type_constraint('Item'),