Class-Contract
view release on metacpan or search on metacpan
lib/Class/Contract.pm view on Meta::CPAN
}
goto &Exporter::import;
}
sub unimport {
my $class = shift;
my $caller = caller;
$contract{$caller}{use_old} = 0 if grep /^old$/, @_;
}
sub contract(&) { $_[0]->(); _build_class(caller) }
sub check(\%;$) {
# NOT IN PRODUCTION...
my $state = !$#_ ? 0 : $_[1] ? 1 : 0;
defined $_
or croak("Usage:\n\tcheck \%sentinel",
($#_ ? " => $state" : ""),
" for ( \@classes );\n\n");
my $forclass = $_;
lib/Class/Contract.pm view on Meta::CPAN
}
$msg_target = $descriptor;
}
sub failmsg {
croak "Unattached failmsg" unless $msg_target;
$msg_target->{'msg'} = shift;
}
sub pre(&) { _current('pre' => @_) }
sub post(&) { _current('post' => @_) }
sub impl(&) { _current('impl' => @_) }
sub optional { # my (@descriptors) = @_;
$_->{'opt'} = 1 foreach(@_); @_ # NOT IN PRODUCTION
}
sub invar(&) {
my ($code) = @_;
my $descriptor = {
'code' => $code,
'opt' => 0, # NOT IN PRODUCTION
'msg' => $def_msg{'invar'},
};
@{$descriptor}{qw(owner loc)} = _location;
push @{$contract{$descriptor->{'owner'}}{'invar'}}, $descriptor;
lib/Class/Contract/Production.pm view on Meta::CPAN
}
goto &Exporter::import;
}
sub unimport {
my $class = shift;
my $caller = caller;
$contract{$caller}{use_old} = 0 if grep /^old$/, @_;
}
sub contract(&) { $_[0]->(); _build_class(caller) }
sub check(\%;$) {
}
sub _location { # scalar context returns file and line of external code
# array context returns package aka 'owner', file and line
my ($i, @c, $owner);
while (@c = (caller($i++))[0..2]) {
if ($c[0] !~ /^Class::Contract::Production$/) {
lib/Class/Contract/Production.pm view on Meta::CPAN
}
$msg_target = $descriptor;
}
sub failmsg {
croak "Unattached failmsg" unless $msg_target;
$msg_target->{'msg'} = shift;
}
sub pre(&) { _current('pre' => @_) }
sub post(&) { _current('post' => @_) }
sub impl(&) { _current('impl' => @_) }
sub optional { # my (@descriptors) = @_;
}
sub invar(&) {
my ($code) = @_;
my $descriptor = {
'code' => $code,
'msg' => $def_msg{'invar'},
};
@{$descriptor}{qw(owner loc)} = _location;
push @{$contract{$descriptor->{'owner'}}{'invar'}}, $descriptor;
$msg_target = $descriptor;
( run in 0.719 second using v1.01-cache-2.11-cpan-49f99fa48dc )