package DeWeave::Collection::Bookmarks;
use Moose;
use namespace::autoclean;
use DeWeave::BO::Bookmark::Base;
use DeWeave::BO::Bookmark::Bookmark;
use DeWeave::BO::Bookmark::Microsummary;
use DeWeave::BO::Bookmark::Folder;
use DeWeave::BO::Bookmark::Livemark;
use DeWeave::BO::Bookmark::Separator;
use DeWeave::BO::Bookmark::Query;
use MooseX::Types::Moose qw(HashRef);
extends 'DeWeave::Collection';
has _item_cache => (
isa => HashRef['DeWeave::BO::Bookmark::Base'],
lazy_build => 1,
traits => ['Hash'],
handles => {
item_by_id => 'get',
item_known => 'exists',
},
);
sub _build__item_cache {
my ($self) = @_;
my %ret;
for my $item (@{$self->items}) {
$ret{$item->id}=$item;
}
return \%ret;
}
sub item_class {
my ($class,$input_item) = @_;
my $item_class = 'Base';
if (exists $input_item->{type} && defined $input_item->{type}) {
$item_class = ucfirst($input_item->{type});
}
return "DeWeave::BO::Bookmark::$item_class";
}
sub as_tree {
my ($self,$start_id) = @_;
$start_id ||= 'menu';
return $self->_as_tree_rec($start_id,0);
}
sub _as_tree_rec {
my ($self,$start_id,$depth) = @_;
if (!$self->item_known($start_id)) {
return ((' ' x $depth)." $start_id is unknown\n");
}
my $item = $self->item_by_id($start_id);
my $padding = ' ' x $depth;
my $out = $item->as_string;
$out =~ s/^/$padding/smg;
if ($item->can('children')) {
for my $child_id (@{$item->children}) {
$out .= $self->_as_tree_rec($child_id,$depth+1);
}
}
return $out;
}
1;
__END__