Changeset 17689 for lang

Show
Ignore:
Timestamp:
08/16/08 09:30:42 (6 years ago)
Author:
daisuke
Message:

coerce instead of hand manipulation

Location:
lang/perl/MooseX-DOM/trunk/lib/MooseX/DOM
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/MooseX-DOM/trunk/lib/MooseX/DOM/LibXML.pm

    r17687 r17689  
    1212    is => 'rw', 
    1313    isa => 'MooseX::DOM::LibXML::ContextNode', 
     14    coerce => 1, 
    1415); 
    1516 
     
    2324no Moose; 
    2425 
     26sub BUILD { 
     27    my $self = shift; 
     28    $self->node->register_namespaces( $self->namespaces ); 
     29    $self; 
     30} 
     31 
    2532sub init_meta { 
    2633    # Only MooseX::DOM knows the true caller, so we expect it to 
     
    3340        'MooseX::DOM::Meta::LibXML' 
    3441    ); 
    35 } 
    36  
    37 sub BUILDARGS { 
    38     my ($self, %args) = @_; 
    39  
    40     my $namespaces = $args{namespaces} || {}; 
    41     my $node = delete $args{node}; 
    42     if ($node) { 
    43         if (! ref $node) { 
    44             $node = MooseX::DOM::LibXML::ContextNode->new( 
    45                 node => XML::LibXML->new->parse_string($node)->documentElement, 
    46                 namespaces => $namespaces 
    47             ); 
    48         } elsif ($node->isa('XML::LibXML::Element')) { 
    49             $node = MooseX::DOM::LibXML::ContextNode->new( 
    50                 node => $node, 
    51                 namespaces => $namespaces 
    52             ); 
    53         } else { 
    54             confess "Don't know how to handle $node"; 
    55         } 
    56  
    57         $args{node} = $node; 
    58     } 
    59  
    60     return  { %args }; 
    6142} 
    6243 
     
    10889                # attributes => { attr1 => $val1, attr2 => $val2 } 
    10990 
     91 
     92                # Find the meta attribute for 'node', and add type constraints 
     93                 
    11094                $tag = $args{tag} if $args{tag}; 
    11195                my $attrs = $args{attributes}; 
    11296 
    11397                my $meta = $caller->meta; 
     98                my $node_attr = $meta->get_attribute('node'); 
     99                return () unless $node_attr; 
     100 
     101 
    114102                $meta->dom_root( { tag => $tag, attributes => $attrs } ); 
    115103 
  • lang/perl/MooseX-DOM/trunk/lib/MooseX/DOM/LibXML/ContextNode.pm

    r17247 r17689  
    33package MooseX::DOM::LibXML::ContextNode; 
    44use Moose; 
     5use Moose::Util::TypeConstraints; 
    56use Class::Inspector; 
    67use XML::LibXML; 
    78use XML::LibXML::XPathContext; 
     9 
     10coerce 'MooseX::DOM::LibXML::ContextNode' 
     11    => from 'Str' 
     12    => via {  
     13        MooseX::DOM::LibXML::ContextNode->new( 
     14            node => XML::LibXML->new->parse_string($_)->documentElement 
     15        ) 
     16    } 
     17; 
    818 
    919has 'node' => ( 
     
    2232    is => 'rw', 
    2333    isa => 'XML::LibXML::XPathContext', 
    24     required => 1, 
    2534    handles => [ qw(findnodes findvalue) ], 
    2635); 
     
    3039no Moose; 
    3140 
    32 sub BUILDARGS { 
    33     my ($self, %args) = @_; 
     41sub BUILD { 
     42    my ($self, $args) = @_; 
    3443 
    35     my $xc = XML::LibXML::XPathContext->new($args{node}); 
    36     while (my ($prefix, $uri) = each %{ $args{namespaces} || {} }) { 
     44    my $xc = XML::LibXML::XPathContext->new($self->node); 
     45    $self->context($xc); 
     46    $self->register_namespaces( $args->{namespaces} ) if $args->{namespaces}; 
     47    $self; 
     48} 
     49 
     50sub register_namespaces { 
     51    my ($self, $namespaces) = @_; 
     52 
     53    my $xc = $self->context; 
     54    while (my ($prefix, $uri) = each %{ $namespaces || {} }) { 
    3755        next if defined $xc->lookupNs($uri); 
    3856 
    3957        $xc->registerNs($prefix, $uri); 
    4058    } 
    41  
    42     return { %args, context => $xc }; 
    4359} 
    4460 
     61 
    45621;