2012-06-16 40 views
6

Nếu Tôi tuyên bố thuộc tính lười biếng trong lớp perl sử dụng Moose, và các thuộc tính được sử dụng xây dựng:Bộ công cụ mẫu và thuộc tính Moose lười biếng - cách làm cho chúng hoạt động?

has 'colors' => (
    is => 'rw', 
    isa => 'ArrayRef', 
    lazy => 1, 
    builder => '_build_colors', 
); 

sau đó trong mẫu Template :: Toolkit tôi sẽ cố gắng sử dụng thuộc tính này:

[% FOREACH color IN colors %] 
... 
[% END %] 

Tôi sẽ không nhận được gì. Tôi phải gọi thủ công attr này trong kịch bản perl trước khi xử lý các thuộc tính với TT. Có cách nào TT có thể tự khởi tạo attr này không?

Trả lời

13

Tôi giả sử bạn đang truyền đối tượng Moose như thế này.

$template->process('some.tt', $moose_object, ...); 

Tham số thứ hai được giả định là một hàm băm nhỏ, không phải bất kỳ loại đối tượng may mắn nào (Moose hay không).

Vì vậy, đối tượng Moose được coi là băm đơn giản và không có khóa 'màu' cho đến khi bạn điền vào bằng cách gọi trình truy cập bên ngoài Bộ công cụ mẫu.

Bạn cần phải làm một cái gì đó như thế này:

$template->process('some.tt', { obj => $moose_object }, ...); 

Và sau đó trong mẫu của bạn:

[% FOREACH color IN obj.colors %] 
... 
[% END %] 

nào nên làm việc như bạn mong đợi nó.

+1

Đoán tốt về lỗi thực tế của OP! Tôi đặt cược bạn đã cắn bởi điều này trước khi :) – ikegami

+0

@ikegami Không, nhưng tôi đã dành quá nhiều thời gian gần đây làm việc với Template Toolkit và cần phải nghiên cứu cách stash hoạt động. – Dre

+1

Có, sơ đồ thực tế phức tạp hơn một chút, nhưng nói chung cách của bạn đã làm việc cho tôi, cảm ơn! – Sly