#! /usr/bin/env perl use strict; use warnings; use 5.10.0; package Foo; use Moose; use Moose::Util::TypeConstraints; use namespace::autoclean; use Path::Class qw / file /; subtype 'AFile' => as 'Path::Class::File' => message { 'Item is not a Path::Class::File' }; coerce 'AFile' => from 'Str' => via { file($_) }; subtype 'ExistingFile' => as 'AFile' => where { say "In subtype where clause: $_[0]"; -f $_[0] }, message { "$_[0] does not exist" }; has file => ( isa => 'ExistingFile', is => 'ro', required => 1 ); __PACKAGE__->meta->make_immutable; package main; use Path::Class qw / file /; say $0; eval { my $foo = Foo->new(file => file($0)); }; say ":::".$@.":::"; eval { my $foo = Foo->new(file => $0); }; say ":::".$@.":::"; #### subtype_madness.pl In subtype where clause: subtype_madness.pl :::::: :::Attribute (file) does not pass the type constraint because: subtype_madness.pl does not exist at constructor Foo::new (defined at subtype_madness.pl line 29) line 34 Foo::new('Foo', 'file', 'subtype_madness.pl') called at subtype_madness.pl line 36 eval {...} at subtype_madness.pl line 36 :::