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