Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Navigator/Builder.pm @ 103:c289ed9662ca
Schema beta 2
More strict validation, support for inflating a simple nodes and properties
| author | wizard |
|---|---|
| date | Fri, 07 May 2010 18:17:40 +0400 |
| parents | cf3b6ef2be22 |
| children | 196bf443b5e1 |
comparison
equal
deleted
inserted
replaced
| 102:cf3b6ef2be22 | 103:c289ed9662ca |
|---|---|
| 9 | 9 |
| 10 BEGIN { | 10 BEGIN { |
| 11 private _direct property _schemaNavi => prop_all; | 11 private _direct property _schemaNavi => prop_all; |
| 12 private _direct property _nodesPath => prop_all; | 12 private _direct property _nodesPath => prop_all; |
| 13 private _direct property _nodeCurrent => prop_all; | 13 private _direct property _nodeCurrent => prop_all; |
| 14 private _direct property _docClass => prop_all | 14 private _direct property _docClass => prop_all; |
| 15 public _direct property Document => prop_get | owner_set; | 15 public _direct property Document => prop_get | owner_set; |
| 16 } | 16 } |
| 17 | 17 |
| 18 sub CTOR { | 18 sub CTOR { |
| 19 my ($this,$docClass,$schema) = @_; | 19 my ($this,$docClass,$schema) = @_; |
| 25 sub NavigateCreate { | 25 sub NavigateCreate { |
| 26 my ($this,$nodeName,%props) = @_; | 26 my ($this,$nodeName,%props) = @_; |
| 27 | 27 |
| 28 if (my $schemaNode = $this->{$_schemaNavi}->NavigateName($nodeName)) { | 28 if (my $schemaNode = $this->{$_schemaNavi}->NavigateName($nodeName)) { |
| 29 my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType : 'IMPL::DOM::Node'; | 29 my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType : 'IMPL::DOM::Node'; |
| 30 $this->inflateProperties($schemaNode,\%props); | |
| 30 | 31 |
| 31 my $node; | 32 my $node; |
| 32 if (! $this->{$Document}) { | 33 if (! $this->{$Document}) { |
| 33 $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); | 34 $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); |
| 34 } else { | 35 } else { |
| 40 | 41 |
| 41 $this->{$_nodeCurrent} = $node; | 42 $this->{$_nodeCurrent} = $node; |
| 42 | 43 |
| 43 return $node; | 44 return $node; |
| 44 } else { | 45 } else { |
| 45 warn $nodeName; | |
| 46 die new IMPL::InvalidOperationException("The specified node is undefined", $nodeName); | 46 die new IMPL::InvalidOperationException("The specified node is undefined", $nodeName); |
| 47 } | 47 } |
| 48 } | |
| 49 | |
| 50 sub inflateProperties { | |
| 51 my ($this,$schemaNode,$refProps) = @_; | |
| 52 | |
| 53 $refProps->{$_->name} = $_->inflator->new($refProps->{$_->name}) | |
| 54 foreach $schemaNode->selectNodes( | |
| 55 sub { | |
| 56 $_->nodeName eq 'Property' and exists $refProps->{$_->name} and $_->inflator | |
| 57 } | |
| 58 ); | |
| 59 } | |
| 60 | |
| 61 sub inflateValue { | |
| 62 my ($this,$value) = @_; | |
| 63 my $schemaNode = $this->{$_schemaNavi}->Current; | |
| 64 if ($schemaNode->can('inflator') and my $inflator = $schemaNode->inflator) { | |
| 65 return $inflator->new($value); | |
| 66 } else { | |
| 67 return $value; | |
| 68 } | |
| 48 } | 69 } |
| 49 | 70 |
| 50 sub Back { | 71 sub Back { |
| 51 my ($this) = @_; | 72 my ($this) = @_; |
| 52 | 73 |
