The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 2;
use Test::Exception;

package Foo;
use Moose;

sub foo {
    my $self = shift;
    my ($arg) = shift;
    die 'arg must be positive' if $arg < 0;
    return $arg;
}

package Foo::Sub;
use Moose;
use MooseX::Mangle;
extends 'Foo';

guard foo => sub {
    my $self = shift;
    my ($arg) = @_;
    return $arg >= 0;
};

package main;
my $foosub = Foo::Sub->new;
is($foosub->foo(2), 2, 'foo is called if guard succeeds');
lives_and { is($foosub->foo(-2), undef) } 'foo returns undef on guard failure';