X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FTypeRegistry.pm;h=9c18bd231c737b2b225565f823cd63561a0250b7;hb=31f5a7f75be930dbeffb8836e7e21faf4312a1dc;hp=4f3125cc92462261975ea9c898da2ab7cc6446c4;hpb=27a22464224e930cc8c32ba969e787aacd863b9e;p=gitmo%2FMouse.git diff --git a/lib/Mouse/TypeRegistry.pm b/lib/Mouse/TypeRegistry.pm index 4f3125c..9c18bd2 100644 --- a/lib/Mouse/TypeRegistry.pm +++ b/lib/Mouse/TypeRegistry.pm @@ -18,7 +18,6 @@ sub optimized_constraints { Num => sub { !ref($_) && looks_like_number($_) }, Int => sub { defined($_) && !ref($_) && /^-?[0-9]+$/ }, Str => sub { defined($_) && !ref($_) }, - ClassName => sub { 1 }, Ref => sub { ref($_) }, ScalarRef => sub { ref($_) eq 'SCALAR' }, @@ -37,6 +36,35 @@ sub optimized_constraints { }, Object => sub { blessed($_) && blessed($_) ne 'Regexp' }, + + ClassName => sub { + return if ref($_); + return unless defined($_) && length($_); + + # walk the symbol table tree to avoid autovififying + # \*{${main::}{"Foo::"}} == \*main::Foo:: + + my $pack = \*::; + foreach my $part (split('::', $_)) { + return unless exists ${$$pack}{"${part}::"}; + $pack = \*{${$$pack}{"${part}::"}}; + } + + # check for $VERSION or @ISA + return 1 if exists ${$$pack}{VERSION} + && defined *{${$$pack}{VERSION}}{SCALAR}; + return 1 if exists ${$$pack}{ISA} + && defined *{${$$pack}{ISA}}{ARRAY}; + + # check for any method + foreach ( keys %{$$pack} ) { + next if substr($_, -2, 2) eq '::'; + return 1 if defined *{${$$pack}{$_}}{CODE}; + } + + # fail + return; + }, }; }