1

我有以下树状结构,其中每个级别都由单独的类表示:

Book ------ Page ------ Line
     1    n      1    n

每个类都有一个属性来保存它的所有成员(例如/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并想保存Bookmarks 怎么办?

哦,我正在使用 Moose,尽管这应该没什么区别。

4

1 回答 1

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');
于 2013-02-27T23:05:36.920 回答