2013-02-27 189 views
1

我具有以下樹狀結構,其中每個電平由單獨的類表示:保存樹狀結構

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" }, 
       # ... 
      ] 
     }, 
     # ... 
    ] 
}; 

如果有一個智能對在圖書方法知道所有成員類?或者每個班級應該實施其中的一部分,例如Line::save返回類似{ text => "Marble" }

什麼是實現這個正確方法是什麼?我希望儘可能少的解決方案與實際數據相關。如果我決定明天什麼添加Page::bookmarks並要保存Bookmark S作爲呢?

哦,我使用的駝鹿,但不應該太大的差別。

+0

可以序列並恢復與'Storable'模塊祝福的對象。 – PSIAlt 2013-02-27 21:28:34

回答

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');