Есть метод unwrap
, но мне кажется, что я должен его использовать не так, как следует. Похоже, это должна быть либо отдельная процедура, либо метод в другом классе. Что мне не хватает?
Похоже, что ему все равно, что его вызывает, пока он получает правильную Routine::WrapHandle
штуку в качестве аргумента. В этом примере я wrap
выполняю подпрограмму и возвращаю WrapHandle
:
sub add-two-numbers ( $n, $m ) { $n + $m }
sub do-some-stuff ( $n, $m, $o ) {
add-two-numbers( $n max $m, $m max $o );
}
put do-some-stuff( 5, 10, 15 );
# now I want to look into do-some-stuff to see what it's
# passing
my $wraphandle = &add-two-numbers.wrap: {
say "Arguments were (@_[])";
callwith( |@_ );
}
put do-some-stuff( 5, 10, 15 );
Затем я могу создать другую и не связанную процедуру и вызвать для нее unwrap
:
my &routine = sub { 1 };
&routine.unwrap( $wraphandle );
put do-some-stuff( 5, 10, 15 );
Инвокант к unwrap
кажется излишним. Действительно, я могу вызвать его как метод класса, и он все еще работает:
Routine.unwrap( $wraphandle );
Но, похоже, это должно быть либо рутиной (поскольку вызывающий не имеет значения):
unwrap( $wraphandle ); # doesn't exist
Или метод на Routine::WrapHandle
, так как это источник поведения:
$wraphandle.unwrap; # but, this method doesn't exist in that class
Итак, что мне не хватает в этом методе?