use SUPER::DOES (next::method breaks, but SUPER::DOES is still better than ->isa
[gitmo/Moose.git] / lib / Moose / Util / TypeConstraints / OptimizedConstraints.pm
CommitLineData
5d2f0933 1package Moose::Util::TypeConstraints::OptimizedConstraints;
2
3use strict;
4use warnings;
5
28412c0b 6use Scalar::Util 'blessed', 'looks_like_number';
7
19fabdd3 8our $VERSION = '0.52';
28412c0b 9our $AUTHORITY = 'cpan:STEVAN';
5d2f0933 10
fd542f49 11sub Value { defined($_[0]) && !ref($_[0]) }
5d2f0933 12
fd542f49 13sub Ref { ref($_[0]) }
5d2f0933 14
fd542f49 15sub Str { defined($_[0]) && !ref($_[0]) }
bc47531e 16
fd542f49 17sub Num { !ref($_[0]) && looks_like_number($_[0]) }
5d2f0933 18
fd542f49 19sub Int { defined($_[0]) && !ref($_[0]) && $_[0] =~ /^-?[0-9]+$/ }
20
21{
22 no warnings 'uninitialized';
23 sub ScalarRef { ref($_[0]) eq 'SCALAR' }
24 sub ArrayRef { ref($_[0]) eq 'ARRAY' }
25 sub HashRef { ref($_[0]) eq 'HASH' }
26 sub CodeRef { ref($_[0]) eq 'CODE' }
27 sub RegexpRef { ref($_[0]) eq 'Regexp' }
28 sub GlobRef { ref($_[0]) eq 'GLOB' }
29}
30
31sub FileHandle { ref($_[0]) eq 'GLOB' && Scalar::Util::openhandle($_[0]) or blessed($_[0]) && $_[0]->isa("IO::Handle") }
32
33sub Object { blessed($_[0]) && blessed($_[0]) ne 'Regexp' }
34
35sub Role { blessed($_[0]) && $_[0]->can('does') }
36
e151db23 37sub ClassName {
38 return 0 if ref($_[0]) || !defined($_[0]) || !length($_[0]);
39
40 # walk the symbol table tree to avoid autovififying
41 # \*{${main::}{"Foo::"}} == \*main::Foo::
42
43 my $pack = \*::;
44 foreach my $part (split('::', $_[0])) {
45 return 0 unless exists ${$$pack}{"${part}::"};
46 $pack = \*{${$$pack}{"${part}::"}};
47 }
48
49 # check for $VERSION or @ISA
50 return 1 if exists ${$$pack}{VERSION}
51 && defined *{${$$pack}{VERSION}}{SCALAR};
52 return 1 if exists ${$$pack}{ISA}
53 && defined *{${$$pack}{ISA}}{ARRAY};
54
55 # check for any method
56 foreach ( keys %{$$pack} ) {
57 next if substr($_, -2, 2) eq '::';
58 return 1 if defined *{${$$pack}{$_}}{CODE};
59 }
60
61 # fail
62 return 0;
63}
64
fd542f49 65# NOTE:
66# we have XS versions too, ...
67# 04:09 <@konobi> nothingmuch: konobi.co.uk/code/utilsxs.tar.gz
68# 04:09 <@konobi> or utilxs.tar.gz iirc
5d2f0933 69
28412c0b 701;
5d2f0933 71
72__END__
73
74=pod
75
76=head1 NAME
77
78Moose::Util::TypeConstraints::OptimizedConstraints - Optimized constraint
79bodies for various moose types
80
5d2f0933 81=head1 DESCRIPTION
82
004222dc 83This file contains the hand optimized versions of Moose type constraints,
84no user serviceable parts inside.
5d2f0933 85
86=head1 FUNCTIONS
87
88=over 4
89
90=item Value
91
92=item Ref
93
94=item Str
95
96=item Num
97
98=item Int
99
100=item ScalarRef
101
102=item ArrayRef
103
104=item HashRef
105
106=item CodeRef
107
108=item RegexpRef
109
110=item GlobRef
111
112=item FileHandle
113
114=item Object
115
116=item Role
117
e151db23 118=item ClassName
119
5d2f0933 120=back
28412c0b 121
122=head1 BUGS
123
124All complex software has bugs lurking in it, and this module is no
125exception. If you find a bug please either email me, or add the bug
126to cpan-RT.
127
128=head1 AUTHOR
129
130Yuval Kogman E<lt>nothingmuch@cpan.orgE<gt>
131
132=head1 COPYRIGHT AND LICENSE
133
004222dc 134Copyright 2007-2008 by Infinity Interactive, Inc.
28412c0b 135
136L<http://www.iinteractive.com>
137
138This library is free software; you can redistribute it and/or modify
139it under the same terms as Perl itself.
140
141=cut