Aion
view release on metacpan or search on metacpan
lib/Aion/Meta/RequiresFeature.pm view on Meta::CPAN
package Aion::Meta::RequiresFeature;
use common::sense;
use Aion::Meta::Util qw//;
use List::Util qw/pairmap/;
use Scalar::Util qw/looks_like_number reftype blessed refaddr/;
Aion::Meta::Util::create_getters(qw/pkg name opt has/);
# ÐонÑÑÑÑкÑоÑ
sub new {
my ($cls, $pkg, $name, @has) = @_;
bless {pkg => $pkg, name => $name, opt => {@has}, has => \@has}, ref $cls || $cls;
}
# СÑÑоковое пÑедÑÑавление ÑиÑи
lib/Aion/Meta/RequiresFeature.pm view on Meta::CPAN
if (overload::Method($value, '==')) {
return "" unless $value == $other_value;
}
elsif (overload::Method($value, 'eq')) {
return "" unless $value eq $other_value;
}
else {
return "" unless refaddr $value == refaddr $other_value;
}
}
elsif (looks_like_number($value)) {
return "" unless looks_like_number($other_value) && $value == $other_value;
}
elsif (reftype $value eq 'ARRAY') {
for(my $i = 0; $i <= $#$value; $i++) {
return "" unless _deep_equal($value->[$i], $other_value->[$i]);
}
}
elsif (reftype $value eq 'HASH') {
for my $k (keys %$value) {
return "" unless exists $other_value->{$k} && _deep_equal($value->{$k}, $other_value->{$k});
}
lib/Aion/Meta/Util.pm view on Meta::CPAN
$depth++;
join '', '{', join(', ', map({
qq{$_ => ${\val_to_str($v->{$_}, $depth)}} } (
keys %$v > MAX_HASH_SIZE
? (sort keys %$v)[0..MAX_HASH_SIZE]
: sort keys %$v
)), keys %$v > MAX_HASH_SIZE ? '...' : ()), '}';
}
}
else {
my $no_str = ref $v || Scalar::Util::looks_like_number($v);
if(ref $v eq 'Regexp') {
$v = "$v";
$v =~ s{^\(\?\^?([a-z]*):(.*)\)$}{qr/$2/$1}si;
}
else {
$v = overload::Overloaded($v) && !overload::Method($v, '""')
? join("#", Scalar::Util::reftype($v), Scalar::Util::refaddr($v))
: "$v";
}
lib/Aion/Types.pm view on Meta::CPAN
use common::sense;
use warnings FATAL => 'recursion';
use Aion::Meta::Util qw/subref_is_reachable val_to_str/;
use Aion::Type;
use Aion::Type::Lim;
use List::Util qw/all any first/;
use Exporter qw/import/;
require overload;
use POSIX qw//;
use Scalar::Util qw/looks_like_number reftype refaddr blessed/;
use Sub::Util qw//;
our @EXPORT = our @EXPORT_OK = grep {
eval {*{$Aion::Types::{$_}}{CODE}} && !/^(_|(NaN|import|all|any|first|looks_like_number|reftype|refaddr|blessed|subref_is_reachable|val_to_str|DBL_MAX)\z)/n
} keys %Aion::Types::;
# ÐбÑабаÑÑваем аÑÑибÑÑ :Isa
sub MODIFY_CODE_ATTRIBUTES {
my ($pkg, $referent, @attributes) = @_;
grep { /^Isa\((.*)\)\z/s? do { _Isa($pkg, $referent, $1); 0 }: 1 } @attributes
}
sub _Isa {
lib/Aion/Types.pm view on Meta::CPAN
subtype "Url", as &Str, where { /^https?:\/\// };
subtype "Path", as &Str, where { /^\// };
subtype "Html", as &Str, where { /^\s*<(!doctype\s+html|html)\b/i };
subtype "StrDate", as &Str, where { /^\d{4}-\d{2}-\d{2}\z/ };
subtype "StrDateTime", as &Str, where { /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\z/ };
subtype "StrMatch[regexp]", as &Str, where { $_ =~ A };
subtype "PackageName", as &Str, where { no utf8; use bytes; /^(?:[a-z]\w*(?:::[a-z]\w*)*)\z/ia };
subtype "ClassName", as &PackageName, where { !!$_->can('new') };
subtype "RoleName", as &PackageName, where { !$_->can('new') && !!(@{"$_\::ISA"} || first { *{$_}{CODE} } values %{"$_\::"}) };
subtype "StrRat", as &Str, where { m!\s*/\s*!? &Num->include($`) && &Num->include($`): &Num->test };
subtype "Num", as &Str, where { looks_like_number($_) && /[\dfn]\z/i };
subtype "Int", as &Num, where { /^[-+]?\d+\z/ };
subtype "Ref", as &Defined, where { "" ne ref $_ };
subtype "Tied`[class]", as &Ref,
where { my $ref = reftype($_); !!(
$ref eq "HASH"? tied %$_:
$ref eq "ARRAY"? tied @$_:
$ref eq "SCALAR"? tied $$_:
0
) }
t/aion/meta/requires-feature.pm view on Meta::CPAN
use common::sense; use open qw/:std :utf8/; use Carp qw//; use File::Basename qw//; use File::Find qw//; use File::Slurper qw//; use File::Spec qw//; use File::Path qw//; use Scalar::Util qw//; use Test::More 0.98; BEGIN { $SIG{__DIE__} = sub ...
#
# use common::sense;
#
# use Aion::Meta::Util qw//;
# use List::Util qw/pairmap/;
# use Scalar::Util qw/looks_like_number reftype blessed refaddr/;
#
# Aion::Meta::Util::create_getters(qw/pkg name opt has/);
#
# # ÐонÑÑÑÑкÑоÑ
# sub new {
# my ($cls, $pkg, $name, @has) = @_;
# bless {pkg => $pkg, name => $name, opt => {@has}, has => \@has}, ref $cls || $cls;
# }
#
# # СÑÑоковое пÑедÑÑавление ÑиÑи
t/aion/meta/requires-feature.pm view on Meta::CPAN
# if (overload::Method($value, '==')) {
# return "" unless $value == $other_value;
# }
# elsif (overload::Method($value, 'eq')) {
# return "" unless $value eq $other_value;
# }
# else {
# return "" if refaddr $value != refaddr $other_value;
# }
# }
# elsif (looks_like_number($value)) {
# return "" unless looks_like_number($other_value) && $value == $other_value;
# }
# elsif (reftype $value eq 'ARRAY') {
# for(my $i = 0; $i <= $#$value; $i++) {
# return "" unless _deep_equal($value->[$i], $other_value->[$i]);
# }
# }
# elsif (reftype $value eq 'HASH') {
# for my $k (keys %$value) {
# return "" unless exists $other_value->{$k} && _deep_equal($value->{$k}, $other_value->{$k});
# }
( run in 1.998 second using v1.01-cache-2.11-cpan-63c85eba8c4 )