/usr/local/CPAN/CORBA-MICO/CORBA/MICO/IREntry.pm
package CORBA::MICO::IREntry;
use Carp;
require CORBA::MICO::IRRoot;
require CORBA::MICO;
use strict;
#--------------------------------------------------------------------
sub new {
my ($type, $name, $ir_node, $root_node) = @_;
my $class = ref($type) || $type;
return bless { 'CONTENTS' => {},
'PARENTS' => undef,
'NAME' => $name,
'ROOT' => $root_node,
'NODE' => $ir_node,
'KIND' => $ir_node->_get_def_kind() }, $class;
}
#--------------------------------------------------------------------
sub name {
my $self = shift;
return $self->{'NAME'};
}
#--------------------------------------------------------------------
sub shname {
my $self = shift;
return $self->{'NAME'} ? $self->{'NODE'}->_get_name() : '';
}
#--------------------------------------------------------------------
sub repoid {
my $self = shift;
return $self->{'NAME'} ? $self->{'NODE'}->_get_id() : '';
}
#--------------------------------------------------------------------
sub kind {
my $self = shift;
return $self->{'KIND'};
}
#--------------------------------------------------------------------
sub root_ir {
my $self = shift;
return $self->{'ROOT'};
}
#--------------------------------------------------------------------
sub ir_node {
my $self = shift;
return $self->{'NODE'};
}
#--------------------------------------------------------------------
sub contents {
my ($self, $kind) = @_;
return exists($self->{'CONTENTS'}->{$kind}) ? $self->{'CONTENTS'}->{$kind}
: $self->_contents($kind);
}
#--------------------------------------------------------------------
sub parents {
my ($self) = @_;
return $self->{'PARENTS'} || $self->_parents();
}
#--------------------------------------------------------------------
sub is_abstract {
my ($self) = @_;
my $kind = $self->{'KIND'};
if( $kind ne 'dk_Interface' and $kind ne 'dk_Value' ) {
return 0;
}
return $self->{'NODE'}->_get_is_abstract();
}
#--------------------------------------------------------------------
sub _contents {
my ($self, $kind) = @_;
my $root_ir = $self->{'ROOT'};
my $ir_node = $self->{'NODE'};
my $contents;
eval { $contents = $ir_node->contents($kind, 1) };
if( $@ ) {
# carp "method contents() is not supported by ", ref($ir_node);
$self->{'CONTENTS'}{$kind} = undef;
return undef;
}
my $buffered = $self->{'CONTENTS'}{$kind} = [];
foreach my $node (@$contents) {
_add_entry($buffered, $node, $root_ir);
}
return $buffered;
}
#--------------------------------------------------------------------
sub _parents {
my ($self) = @_;
my $root_ir = $self->{'ROOT'};
my $ir_node = $self->{'NODE'};
my $kind = $self->{'KIND'};
my $buffered = $self->{'PARENTS'} = [];
my $parents;
if( $kind eq 'dk_Interface' ) {
$parents = $ir_node->_get_base_interfaces();
}
elsif( $kind eq 'dk_Value' ) {
return []; # not implemented yet
}
else {
# carp "method base_interfaces() is not supported by ", ref($ir_node);
return [];
}
foreach my $node (@$parents) {
_add_entry($buffered, $node, $root_ir);
}
return $buffered;
}
#--------------------------------------------------------------------
sub _add_entry {
my ($array, $node, $root_ir) = @_;
my $name = $node->_get_absolute_name();
$root_ir->store_entry($name, $node->_get_id(), $node);
push(@$array, $root_ir->entry($name));
}
1;