diff Lib/IMPL/DOM/Node.pm @ 148:e6447ad85cb4

DOM objects now have a schema and schemaSource properties RegExp now can launder data Improved post to DOM transformation (multiple values a now supported) Added new axes to navigation queries: ancestor and descendant minor changes and bug fixes
author wizard
date Mon, 16 Aug 2010 08:26:44 +0400
parents e30bdd040fe3
children 1e7f03414b65
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Node.pm	Mon Aug 09 08:45:36 2010 +0400
+++ b/Lib/IMPL/DOM/Node.pm	Mon Aug 16 08:26:44 2010 +0400
@@ -17,7 +17,9 @@
     public _direct property isComplex => { get => \&_getIsComplex } ;
     public _direct property nodeValue => prop_all;
     public _direct property childNodes => { get => \&_getChildNodes }; # prop_list
-    public _direct property parentNode => prop_get ;
+    public _direct property parentNode => prop_get | owner_set;
+    public _direct property schema => prop_get | owner_set;
+    public _direct property schemaSource => prop_get | owner_set;
     private _direct property _propertyMap => prop_all ;
     
     __PACKAGE__->class_data(property_bind => {});
@@ -27,7 +29,9 @@
 	parent => \&selectParent,
 	siblings => \&selectSiblings,
 	child => \&childNodes,
-	document => \&selectDocument
+	document => \&selectDocument,
+	ancestor => \&selectAncestors,
+	descendant => \&selectDescendant
 );
 
 sub CTOR {
@@ -290,6 +294,24 @@
 	}
 }
 
+sub selectDescendant {
+	wantarray ?
+		map $_->selectAll(), $_[0]->childNodes :
+		[map $_->selectAll(), $_[0]->childNodes]
+}
+
+sub selectAll {
+    map(selectAll($_),@{$_[0]->childNodes}) , $_[0]
+}
+
+sub selectAncestors {
+	my $parent = $_[0]->parentNode;
+	
+	wantarray ?
+		($parent ? ($parent->selectAncestors,$parent) : ()) :
+		[$parent ? ($parent->selectAncestors,$parent) : ()]
+}
+
 sub firstChild {
     @_ >=2 ? $_[0]->replaceNodeAt(0,$_[1]) : $_[0]->childNodes->[0];
 }
@@ -349,9 +371,11 @@
     my $name = shift;
     
     if (my $method = $this->can($name)) {
-    	return &$method($this,@_);
+    	unshift @_,$this;
+    	# use goto to preserve calling context
+    	goto &$method;
     }
-    
+    # dynamic property
     if (@_) {
 		# set
 	    return $this->{$_propertyMap}{$name} = shift;
@@ -429,6 +453,20 @@
 
 Ссылка на родительский элемент, если таковой имеется.
 
+=item C<[get] schema>
+
+Ссылка на узел из C<IMPL::DOM::Schema>, представляющий схему данных текущего узла. Может быть C<undef>.
+
+=item C<[get] schema>
+
+Ссылка на узел из C<IMPL::DOM::Schema>, представляющий элемент схемы, объявляющий данный узел. Может быть C<undef>.
+
+Отличается от свойства C<schema> тем, что узел в случае ссылки на тип узла, данной свойство будет содержать
+описание ссылки C<IMPL::DOM::Schema::Node>, а свойство C<schema> например будет ссылаться на
+C<IMPL::DOM::Schema::ComplexType>.
+
+=back 
+
 =head2 METHODS
 
 =cut
\ No newline at end of file