我有以下树状结构,其中每个级别由单独的类表示:
Book ------ Page ------ Line
1 n 1 n
每个类都有一个属性,包含其所有成员(e / g / Book::pages
,作为祝福引用的数组),特定于该级别的一些属性(例如Book::author
)以及一些方法添加/删除其成员。
现在我想将所有数据保存/加载到单个文件中。它不会是一个关系数据库(很可能会使用YAML),所以基本上我需要得到的是:
my $book = {
author => "Fred Flinstone",
name => "My Favorite Stones",
pages => [
{
number => 1,
footer => "Dedicated to Wilma",
lines => [ ],
},
{
number => 2,
lines => [
{ text => "Preface", style => "h1" },
{ text => "This book is about my favorite stones:" },
{ text => "Marble" },
# ...
]
},
# ...
]
};
Book中是否应该有一对智能方法可以了解所有成员类?或者每个类应该实现它的一部分,以便例如Line::save
返回了类似{ text => "Marble" }
的内容?
正确的实现此方法的方法是什么?我希望解决方案尽可能与实际数据相关。如果我明天决定添加Page::bookmarks
并希望保存Bookmark
,该怎么办?
哦,我正在使用Moose,虽然这不会产生太大的影响。
答案 0 :(得分:1)
如果您正在使用Moose,我建议您查看MooseX::Storage来处理此问题。您可以在包中使用此模块,然后添加with Storage('format' => 'YAML', 'io' => 'File');
。
这个简单的例子可以帮助您入门:
package Book;
use Moose;
use MooseX::Storage;
with Storage('format' => 'YAML', 'io' => 'File');
...
1;
my $book = Book->new();
...
# to store object
$book->store('book.yml');
# to get object back
my $book2 = Book->load('book.yml');