33e6d44e0e7de7ad5b4d64c4b99e89cee34d5cc2
[booh] / lib / booh / rexml / child.rb
1 require "booh/rexml/node"
2
3 module REXML
4         ##
5         # A Child object is something contained by a parent, and this class
6         # contains methods to support that.  Most user code will not use this
7         # class directly.
8         class Child
9                 include Node
10                 attr_reader :parent             # The Parent of this object
11
12                 # Constructor.  Any inheritors of this class should call super to make
13                 # sure this method is called.
14                 # parent::
15                 #   if supplied, the parent of this child will be set to the
16                 #   supplied value, and self will be added to the parent
17                 def initialize( parent = nil )
18                         @parent = nil  
19                         # Declare @parent, but don't define it.  The next line sets the 
20                         # parent.
21                         parent.add( self ) if parent
22                 end
23
24                 # Replaces this object with another object.  Basically, calls
25                 # Parent.replace_child
26                 #
27                 # Returns:: self
28                 def replace_with( child )
29                         @parent.replace_child( self, child )
30                         self
31                 end
32
33                 # Removes this child from the parent.
34                 #
35                 # Returns:: self
36                 def remove
37                         unless @parent.nil?
38                                 @parent.delete self
39                         end
40                         self
41                 end
42
43                 # Sets the parent of this child to the supplied argument.
44                 #
45                 # other::
46                 #   Must be a Parent object.  If this object is the same object as the
47                 #   existing parent of this child, no action is taken. Otherwise, this
48                 #   child is removed from the current parent (if one exists), and is added
49                 #   to the new parent.
50                 # Returns:: The parent added
51                 def parent=( other )
52                         return @parent if @parent == other
53                         @parent.delete self if defined? @parent and @parent
54                         @parent = other
55                 end
56
57                 alias :next_sibling :next_sibling_node
58                 alias :previous_sibling :previous_sibling_node
59
60                 # Sets the next sibling of this child.  This can be used to insert a child
61                 # after some other child.
62                 #  a = Element.new("a")
63                 #  b = a.add_element("b")
64                 #  c = Element.new("c")
65                 #  b.next_sibling = c
66                 #  # => <a><b/><c/></a>
67                 def next_sibling=( other )
68                   parent.insert_after self, other
69                 end
70
71                 # Sets the previous sibling of this child.  This can be used to insert a 
72                 # child before some other child.
73                 #  a = Element.new("a")
74                 #  b = a.add_element("b")
75                 #  c = Element.new("c")
76                 #  b.previous_sibling = c
77                 #  # => <a><b/><c/></a>
78                 def previous_sibling=(other)
79                   parent.insert_before self, other
80                 end
81
82                 # Returns:: the document this child belongs to, or nil if this child
83                 # belongs to no document
84                 def document
85                         return parent.document unless parent.nil?
86                         nil
87                 end
88
89                 # This doesn't yet handle encodings
90                 def bytes
91                         encoding = document.encoding
92
93                         to_s
94                 end
95         end
96 end