use Attribute::Handlers; use Carp; sub private :ATTR(CODE) { my ($package, $symbol, $referent, $attr, $data, $phase) = @_; my $name = *{$symbol}{NAME}; *{$symbol} = sub { croak "Function $name is declared private in $package" if caller ne $package; $referent->(@_) } }