Идея Синан - отличное начало.
Но с небольшой дополнительной настройкой вы можете использовать свой метод, как обычный метод.
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
my $f = Frob->new;
$f->frob(
sub {
my $self = shift;
print "$self was frobbed\n";
print Carp::longmess('frob')
}
);
print "\nCall frob as normal sub\n";
$f->frobit;
print "\nGoto frob\n";
$f->goto_frob;
BEGIN {
package Frob;
use Moose;
has 'frob' => (
is => 'rw',
isa => 'CodeRef',
);
sub frobit {
&{$_[0]->frob};
}
sub goto_frob {
goto $_[0]->frob;
}
}
Два метода в Frob
очень похожи.
frobit
передает все аргументы, включая invocant к коду ref.
goto_frob
передает все аргументы, включая invocant, в код ref, и заменяет стек стека goto_frob
кодом кода ref.
Для использования зависит от того, что вы хотите в стеке.
Что касается munging хранения тела в Class::MOP::Method
объекта, например, так $method->{body} = sub { 'foo' }
:
Это никогда не является хорошей идеей, чтобы нарушить инкапсуляцию, когда вы делаете ООП. Особенно, когда вы работаете со сложными объектными системами, такими как Moose и Class :: MOP. Он просит неприятностей. Иногда нет другого способа получить то, что вы хотите, но даже тогда нарушение инкапсуляции по-прежнему является плохим.
Sinan очень хорошая идея :) спасибо – xxxxxxx