2010-10-31 39 views
5

Tôi có một số Moose::Role mà tôi muốn gọi một số phụ phụ trên lớp khi vai trò đó được áp dụng cho lớp học.Moose :: Vai trò - cách dễ dàng để tăng cường áp dụng vai trò?

Có cách nào dễ dàng để sửa đổi những gì xảy ra khi vai trò được áp dụng, mà không phải đào quá nhiều vào mã hóa loại Moose::Meta::Role? Lý tưởng nhất, tôi chỉ muốn after 'apply' => ... để thêm nội dung bổ sung.

Edit:

Tôi đặc biệt sử dụng này với một định nghĩa DBIx::Class::Core kết quả để tạo ra một cái gì đó giống như một thành phần đó cũng làm thay đổi các nhà xây dựng. Tôi sẽ chỉ viết nó như một thành phần nếu tôi có thể nhận được tại BUILDARGSBUILD subs cho kết quả, nhưng tôi dường như không thể làm được. Vì vậy, thay vì làm load_component, tôi đang thực hiện with 'role', nhưng một số tác động của thành phần này là thêm mối quan hệ belongs_to vào lớp học. Do đó, tôi đã suy nghĩ cách tốt nhất để làm điều đó là trong khi áp dụng vai trò cho lớp.

+1

Bạn có thể làm rõ hơn một chút bạn muốn làm gì? Những gì bạn sẽ đưa vào giả định của bạn 'sau khi' apply'' phụ? Việc sửa đổi như vậy với MOP thường không được thực hiện, vì vậy gần như chắc chắn là một cách dễ dàng hơn để hoàn thành những gì bạn muốn làm. – Ether

+0

@Ether: chắc chắn, chỉnh sửa trong một chút giải thích thêm. – Carl

+0

Bạn đã thử 'sau BUILD => sub {...}' trong vai trò của mình chưa? – Ether

Trả lời

0

gì tôi thấy rằng hoạt động, là nhỏ gọn, và dường như phù hợp với ý định trong các tài liệu được sử dụng một đặc điểm để thay đổi vai trò meta được sử dụng bởi vai trò đặc biệt của tôi:

package DBIx::Class::Meta::Role::MyRole; 
use Moose; 
BEGIN { extends 'Moose::Meta::Role'; } 
after 'apply' => sub { 
## ..my mods to add extra relationships to DBIx::Class::Core result 
}; 
no Moose; 

package DBIx::Class::MyRole; 
use Moose::Role -metaclass => 'DBIx::Class::Meta::Role::MyRole'; 
1

Bạn có thể sử dụng parameterized role. Có một ví dụ về cách truy cập lớp tiêu thụ trong số tutorial. Điều đó đang được nói, tôi sẽ khuyên bạn nên tham gia các kênh IRC của Moose và DBIx-Class hoặc danh sách gửi thư để tìm kiếm các phương pháp hay nhất về vấn đề này.

4

Trong một nhận xét ngắn gọn, tôi đã giới thiệu cho bạn this question, thảo luận cách truy cập metaclass của lớp mà vai trò đang được áp dụng cho (ví dụ: để bạn có thể xây dựng lên lớp theo điều kiện). Tuy nhiên, đó là việc sử dụng MooseX :: Role :: Parameterized cung cấp cho bạn thông tin đó, và nó cũng sẽ không hoạt động nếu vai trò đang được áp dụng cho một vai trò khác, không phải cho một lớp.

Là một thay thế, bạn có thể viết một hàm lượng đường trong đó nhận được thông tin meta, và xây dựng lên trên một lớp theo cách đó:

sub foo 
{ 
    my ($meta, %options) = @_; 

    # based on what is present in %options, add additional attributes... 
    $meta->add_attribute(...); 
} 

Xem Moose::Cookbook::Extending::Recipe4 cho một ví dụ về cách viết các chức năng đường.

+0

Bạn nghĩ gì về việc sử dụng các đặc điểm để sửa đổi Moose :: Meta :: Role? được mô tả trong tài liệu như cách để thực hiện các sửa đổi đơn giản đối với vai trò meta. – Carl

Các vấn đề liên quan