Apache2-ASP
view release on metacpan or search on metacpan
lib/Apache2/ASP/ASPDOM/Node.pm view on Meta::CPAN
package Apache2::ASP::ASPDOM::Node;
use strict;
use warnings 'all';
use Carp 'confess';
use Scalar::Util 'weaken';
#==============================================================================
sub new
{
my ($class, %args) = @_;
my $s = bless {
%args,
childNodes => [ ],
events => {
before_appendChild => [ ],
after_appendChild => [ ],
},
}, $class;
weaken($s->{parentNode}) if $s->{parentNode};
return $s;
}# end new()
#==============================================================================
sub id { $_[0]->{id} }
sub tagName { $_[0]->{tagName} }
#==============================================================================
sub addHandler
{
my ($s, $event, $code) = @_;
confess "Unknown event '$event'" unless exists($s->{events}->{$event});
return if grep { "$_" eq "$code" } @{$s->{events}->{$event}};
push @{$s->{events}->{$event}}, $code;
}# end addHandler()
#==============================================================================
sub removeHandler
{
my ($s, $event, $code) = @_;
confess "Unknown event '$event'" unless exists($s->{events}->{$event});
for( 0...@{$s->{events}->{$event}} - 1 )
{
splice( @{$s->{events}->{$event}}, $_, 1 )
if "$s->{events}->{$event}->[$_]" eq "$code";
}# end for()
}# end addHandler()
#==============================================================================
sub childNodes
{
@{$_[0]->{childNodes}} or return;
@{$_[0]->{childNodes}}
}# end childNodes()
#==============================================================================
sub parentNode
{
my $s = shift;
@_ ? weaken($s->{parentNode} = shift) : $s->{parentNode};
}# end parentNode()
#==============================================================================
sub appendChild
{
my ($s, $child) = @_;
# Call "before" handlers?
foreach( @{$s->{events}->{before_appendChild}} )
{
local $SIG{__DIE__} = \&confess;
$_->( $s, $child );
}# end foreach()
# Add the child:
$child->parentNode( $s );
push @{$s->{childNodes}}, $child;
# Call "after" handlers?:
foreach( @{$s->{events}->{after_appendChild}} )
{
local $SIG{__DIE__} = \&confess;
$_->( $s, $child );
}# end foreach()
$child;
}# end appendChild()
#==============================================================================
sub removeChild
{
my ($s, $child) = @_;
for( 0...@{$s->{childNodes}} - 1 )
{
if( "$s->{childNodes}->[$_]" eq "$child" )
{
splice( @{$s->{childNodes}}, $_, 1 );
last;
}# end if()
}# end for()
}# end removeChild()
#==============================================================================
sub getElementById
{
my ($s, $id) = @_;
my ($match) = grep {
$_->id eq $id
} $s->childNodes;
return $match if $match;
foreach my $child ( $s->childNodes )
{
$match = $child->getElementById( $id );
( run in 3.609 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )