our
$VERSION
=
'0.50'
;
{
my
$attrs
= Clone::clone( Specio::Constraint::Role::Interface::_attrs() );
for
my
$name
(
qw( parent _inline_generator )
) {
$attrs
->{
$name
}{init_arg} =
undef
;
$attrs
->{
$name
}{builder}
=
$name
=~ /^_/ ?
'_build'
.
$name
:
'_build_'
.
$name
;
}
$attrs
->{role} = {
isa
=>
'Str'
,
required
=> 1,
};
sub
_attrs {
return
$attrs
;
}
}
sub
_wrap_message_generator {
my
$self
=
shift
;
my
$generator
=
shift
;
my
$type
= (
split
/::/, blessed
$self
)[-1];
my
$role
=
$self
->role;
my
$allow_classes
=
$self
->_allow_classes;
unless
(
defined
$generator
) {
$generator
=
sub
{
shift
;
my
$value
=
shift
;
return
"An undef will never pass an $type check (wants $role)"
unless
defined
$value
;
if
(
ref
$value
&& !blessed
$value
) {
my
$dump
= partial_dump(
$value
);
return
"An unblessed reference ($dump) will never pass an $type check (wants $role)"
;
}
if
( !blessed
$value
) {
return
"An empty string will never pass an $type check (wants $role)"
unless
length
$value
;
if
(
$value
=~ /\A
\s*
-?[0-9]+(?:\.[0-9]+)?
(?:[Ee][\-+]?[0-9]+)?
\s*
\z/xs
) {
return
"A number ($value) will never pass an $type check (wants $role)"
;
}
if
( !
$allow_classes
) {
my
$dump
= partial_dump(
$value
);
return
"A plain scalar ($dump) will never pass an $type check (wants $role)"
;
}
}
my
$got
= blessed
$value
;
$got
||=
$value
;
return
"The $got class does not consume the $role role"
;
};
}
return
sub
{
$generator
->(
undef
,
@_
) };
}
1;