Aion-Spirit

 view release on metacpan or  search on metacpan

lib/Aion/Spirit.pm  view on Meta::CPAN

package Aion::Spirit;
use 5.22.0;
no strict; no warnings; no diagnostics;
use common::sense;

our $VERSION = "0.0.1";

use Exporter qw/import/;
our @EXPORT = our @EXPORT_OK = grep {
	*{$Aion::Spirit::{$_}}{CODE} && !/^(_|(NaN|import)\z)/n
} keys %Aion::Spirit::;


use Sub::Util qw//;

#@category Аспект-ориентированное программирование

# Оборачивает функции в пакете в указанную по регулярке. 
# Имя функции идёт вместе с пакетом
sub aroundsub($$;$) {
	my ($pkg, $re, $around) = @_==3? @_: (scalar caller, @_);
	my $x = \%{"${pkg}::"};

	for my $g (values %$x) {
		next if ref \$g ne "GLOB";
		my $sub = *{$g}{CODE};

		if($sub && Sub::Util::subname($sub) =~ $re) {
			*$g = wrapsub($sub => $around);
		}
	}
}

# Оборачивает функцию в другую
sub wrapsub($$) {
	my ($sub, $around) = @_;

	my $s = sub { unshift @_, $sub; goto &$around };

	my $subname = Sub::Util::subname $sub;

	Sub::Util::set_subname "${subname}__AROUND" =>
	Sub::Util::set_prototype Sub::Util::prototype($sub) => $s;

	$s
}

#@category Проверки

# assert
sub ASSERT ($$) {
	die "ASSERT: ".(ref $_[1]? $_[1]->(): $_[1])."\n" if !$_[0];
}

#@category Списки

# Ищет в списке первое совпадение и возвращает индекс найденного элемента
sub firstidx (&@) {
	my $s = shift;

	my $i = 0;
	for(@_) {
		return $i if $s->();
		$i++;
	}
	return undef;
}

1;

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 1.546 second using v1.00-cache-2.02-grep-82fe00e-cpan-3b7f77b76a6c )