strongmonkey
@strongmonkey

Как узнать имя текущий функции?

Доброго времени суток !
Помогите решить задачку! нужно вернуть имя вызванного метода для анонимной функции!
package method;
use strict;
use warnings FATAL => 'all';

my @list_method = qw(method_1 method_2 method_3);

sub new {
  my ($class, $options) = @_;
  __genereate_method();

  return bless {}, $class;
}


sub __genereate_method {

  no strict 'refs';
  foreach my $element (@list_method)
  {
    *{__PACKAGE__."::$element"} = sub {
      my $self = shift;
      my $sub_name = (caller(0))[3];
      return $sub_name ;
    }
  }
}

1;


#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use FindBin;
use lib "$FindBin::Bin";
use method;

my $method ||= method->new();

isa_ok($method, "method");
foreach my $element (qw(method_1 method_2 method_3))
{
  can_ok($method, $element);
}
is($method->method_1, 'method_1');
is($method->method_2, 'method_2');
is($method->method_3, 'method_3');

done_testing();
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
strongmonkey
@strongmonkey Автор вопроса
Решено.

package method;
use strict;
use warnings FATAL => 'all';

my @list_method = qw(method_1 method_2 method_3);

sub new {
  my ($class, $options) = @_;
  __genereate_code();

  return bless {}, $class;
}

sub __make_method {
  my ( $method, $code, $pkg ) = @_;

  $pkg ||= caller();
  no strict 'refs';
  *{ $pkg . "::$method" } = $code;
}

sub __genereate_code {
  foreach my $element (@list_method)
  {
    __make_method($element, sub { return $element; } );
  }
}

1;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы