1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
require "rexml/node"
module REXML
##
# A Child object is something contained by a parent, and this class
# contains methods to support that. Most user code will not use this
# class directly.
class Child
include Node
attr_reader :parent # The Parent of this object
##
# Constructor. Any inheritors of this class should call super to make
# sure this method is called.
# @param parent if supplied, the parent of this child will be set to the
# supplied value, and self will be added to the parent
def initialize( parent = nil )
@parent = nil
parent << self unless parent.nil?
end
##
# Replaces this object with another object. Basically, calls
# Parent.replace_child
# @return self
def replace_with( child )
@parent.replace_child( self, child )
self
end
##
# Removes this child from the parent.
# @return self
def remove
unless @parent.nil?
@parent.delete self
end
self
end
def parent=( other )
@parent.delete self if defined? @parent and @parent
@parent = other
end
alias :next_sibling :next_sibling_node
alias :previous_sibling :previous_sibling_node
def next_sibling=( other )
parent.insert_after self, other
end
def previous_sibling=(other)
parent.insert_before self, other
end
##
# @return the document this child belongs to, or nil if this child
# belongs to no document
def document
return parent.document unless parent.nil?
nil
end
##
# This doesn't yet handle encodings
def bytes
encoding = document.encoding
to_s
end
def Child.once(*ids)
for id in ids
module_eval <<-"end_eval"
alias_method :__#{id.to_i}__, #{id.inspect}
def #{id.id2name}(*args, &block)
def self.#{id.id2name}(*args, &block)
@__#{id.to_i}__
end
@__#{id.to_i}__ = __#{id.to_i}__(*args, &block)
end
end_eval
end
end
end
end
|