1 # vim: ts=8:sw=4:sts=4:et
2 package DBIx::Class::Tree::AdjacencyList::Positional;
5 use base qw( DBIx::Class );
8 __PACKAGE__->load_components(qw(
15 DBIx::Class::Tree::AdjacencyList::Positional - Glue DBIx::Class::Positional and DBIx::Class::Tree::AdjacencyList together. (EXPERIMENTAL)
19 Create a table for your tree data.
21 CREATE TABLE employees (
22 employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
23 parent_id INTEGER NOT NULL,
24 position INTEGER NOT NULL,
28 In your Schema or DB class add Tree::AdjacencyList::Positional
29 to the top of the component list.
31 __PACKAGE__->load_components(qw( Tree::AdjacencyList::Positional ... ));
33 Specify the column that contains the parent ID and position of each row.
36 __PACKAGE__->parent_column('parent_id');
37 __PACAKGE__->position_column('position');
39 This module provides a few extra methods beyond what
40 L<DBIx::Class::Positional> and L<DBIx::Class::Tree::AdjacencyList>
43 my $parent = $employee->parent();
44 $employee->parent( $parent_obj );
45 $employee->parent( $parent_id );
47 my $children_rs = $employee->children();
48 my @children = $employee->children();
50 $parent->append_child( $child );
51 $parent->prepend_child( $child );
53 $this->attach_before( $that );
54 $this->attach_after( $that );
58 This module provides methods for working with adjacency lists and positional
59 rows. All of the methods that L<DBIx::Class::Positional> and
60 L<DBIx::Class::Tree::AdjacencyList> provide are available with this module.
67 my $parent = $employee->parent();
68 $employee->parent( $parent_obj );
69 $employee->parent( $parent_id );
71 my $children_rs = $employee->children();
72 my @children = $employee->children();
74 This method works exactly like it does in the
75 DBIx::Class::Tree::AdjacencyList module except that it will
76 first move the object to the last position of the list, change
77 the parent ID, then move the object to the last position of
78 the new list. This ensures the intergrity of the positions.
83 my( $self, $new_parent ) = @_;
85 if (ref($new_parent)) {
86 $new_parent = $new_parent->id() || 0;
88 return 0 if ($new_parent == ($self->get_column($self->parent_column())||0));
90 return 0 if (!$self->next::method( $new_parent ));
92 $self->position_column() => $self->search( {$self->_collection_clause()} )->count() + 1
98 return $self->next::method();
104 my $children_rs = $employee->children();
105 my @children = $employee->children();
107 This method works just like it does in the
108 DBIx::Class::Tree::AdjacencyList module except it
109 orders the children by there position.
115 my $rs = $self->search(
116 { $self->parent_column() => $self->id() },
117 { order_by => $self->position_column() }
119 return $rs->all() if (wantarray());
125 $parent->append_child( $child );
127 Sets the child to have the specified parent and moves the
128 child to the last position.
133 my( $self, $child ) = @_;
134 $child->parent( $self );
139 $parent->prepend_child( $child );
141 Sets the child to have the specified parent and moves the
142 child to the first position.
147 my( $self, $child ) = @_;
148 $child->parent( $self );
149 $child->move_first();
154 $this->attach_before( $that );
156 Attaches the object at the position just before the
157 calling object's position.
162 my( $self, $sibling ) = @_;
163 $sibling->parent( $self->parent() );
164 $sibling->move_to( $self->get_column($self->position_column()) );
169 $this->attach_after( $that );
171 Attaches the object at the position just after the
172 calling object's position.
177 my( $self, $sibling ) = @_;
178 $sibling->parent( $self->parent() );
179 $sibling->move_to( $self->get_column($self->position_column()) + 1 );
182 =head1 PRIVATE METHODS
184 These methods are used internally. You should never have the
187 =head2 _collection_clause
189 This method is provided as an override of the method in
190 L<DBIx::Class::Positional>. This method is what provides the
191 glue between AdjacencyList and Positional.
195 sub _collection_clause {
198 $self->parent_column() =>
199 $self->get_column($self->parent_column())
208 Aran Clary Deltac <bluefeet@cpan.org>
212 You may distribute this code under the same terms as Perl itself.