Как обернуть не-OO-модуль функций в класс Moose - PullRequest
1 голос
/ 02 мая 2011

Несколько месяцев назад я начал использовать Moose.

Существуют некоторые не OO-модули, которые я использую просто из связанных функций.Я хотел бы использовать эти функции в классах Moose в качестве методов.Может быть, самый простой способ сделать это, как

#!/usr/bin/env perl

package FuncPack;

sub func_1 {
    print "-> ", __PACKAGE__, "::func_1 called \n";
}

package FuncClass;
use Moose;
use namespace::autoclean;

sub func_1 {
    my $self = shift ;
    return FuncPack::func_1(@_);
}

__PACKAGE__->meta->make_immutable;


package main;

my $obj = FuncClass->new();    
$obj->func_1(); # shall call FuncPack::func_1 

Для одной функции это может быть хорошо, но если у вас много, это повторяющееся и скучное задание.Есть ли более умный способ сделать это?Может быть, есть что-то похожее на MooseX :: NonMoose или MooseX :: InsideOut, которые предназначены для расширения классов, не относящихся к Moose?

Спасибо за совет или подсказку.

1 Ответ

2 голосов
/ 02 мая 2011

Moose обычно с этим не справляется, оборачивание не OO-модулей в OO-фреймворке кажется немного странным. Однако, если у вас есть список методов (или вы можете сгенерировать один), вы можете сделать что-то вроде:

package FuncClass;
use Moose;

my @list = qw( func_1 func_2 func_3 ... );
for my $method in @list {
   __PACKAGE__->meta->add_method(
       $method => sub { my $s = shift; FuncPack::$method(@_)  
   });
}

Вы можете использовать что-то вроде Package::Stash, чтобы вытащить список функций из FuncPack.

Мне интересно, однако, почему вы хотели бы сделать это для начала? Ваш FuncClass не будет иметь абсолютно никакого состояния и на самом деле не будет служить какой-либо другой цели, кроме добавления слоя косвенности.

...