From: Stevan Little Date: Fri, 23 Nov 2007 17:48:07 +0000 (+0000) Subject: Mooseing around; X-Git-Tag: 0_32~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0e0709eaf91314532eea44b03fc7272123745fd2;p=gitmo%2FMoose.git Mooseing around; --- diff --git a/Changes b/Changes index caa9e8d..fcbdf40 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ Revision history for Perl extension Moose +0.30 * Moose::Meta::Method::Constructor -builder related bug in inlined constructor. (groditi) @@ -8,7 +9,7 @@ Revision history for Perl extension Moose code generation for runtime speed (groditi) * Moose::Util::TypeConstraints - - fix ClassName constraint to introspect symbol table + - fix ClassName constraint to introspect symbol table (mst) * t/ - New tests for builder bug. Upon instantiation, if an diff --git a/README b/README index cca8e3b..d39ad82 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -Moose version 0.27 +Moose version 0.30 =========================== See the individual module documentation for more information diff --git a/lib/Moose/Util/TypeConstraints.pm b/lib/Moose/Util/TypeConstraints.pm index 44690df..149c81b 100644 --- a/lib/Moose/Util/TypeConstraints.pm +++ b/lib/Moose/Util/TypeConstraints.pm @@ -409,63 +409,39 @@ subtype 'Role' => where { $_->can('does') } => optimize_as { blessed($_[0]) && $_[0]->can('does') }; +my $_class_name_checker = sub { + return if ref($_[0]); + return unless defined($_[0]) && length($_[0]); + + # walk the symbol table tree to avoid autovififying + # \*{${main::}{"Foo::"}} == \*main::Foo:: + + my $pack = \*::; + foreach my $part (split('::', $_[0])) { + 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; +}; + subtype 'ClassName' => as 'Str' - => where { - 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; - } - => optimize_as { - return if ref($_[0]); - return unless defined($_[0]) && length($_[0]); - - # walk the symbol table tree to avoid autovififying - # \*{${main::}{"Foo::"}} == \*main::Foo:: - - my $pack = \*::; - foreach my $part (split('::', $_[0])) { - 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; - }; + => $_class_name_checker # where ... + => { optimize => $_class_name_checker }; ## -------------------------------------------------------- # end of built-in types ...