package XML::Validator::Schema::Library; use strict; use warnings; use XML::Validator::Schema::Util qw(XSD _err); use Carp qw(croak); =head1 NAME XML::Validator::Schema::TypeLibrary =head1 DESCRIPTION Internal base class used to implement a libraries of named items. =cut sub new { my $pkg = shift; my $self = bless({@_}, $pkg); croak("Missing required 'what' parameter.") unless $self->{what}; # initialize stacks $self->{stacks} = {}; return $self; } sub find_all { my $self = shift; my @ret; foreach my $ns (keys %{$self->{stacks}}) { foreach my $name (keys %{$self->{$ns}}) { push @ret, $self->{stacks}{$ns}{$name}; } } return @ret; } sub find { my ($self, %arg) = @_; croak("Missing required name paramter.") unless $arg{name}; # HACK: fix when QName resolution works $arg{name} =~ s!^[^:]*:!!; $arg{ns} ||= XSD; return $self->{stacks}{$arg{ns}}{$arg{name}}; } sub add { my ($self, %arg) = @_; croak("Missing required name paramter.") unless $arg{name}; croak("Missing required obj paramter.") unless $arg{obj}; # HACK: fix when QName resolution works $arg{name} =~ s!^\w+:!!; $arg{ns} ||= XSD; _err("Illegal attempt to redefine $self->{what} '$arg{name}' ". "in namespace '$arg{ns}'") if exists $self->{stacks}{$arg{ns}}{$arg{name}}; $self->{stacks}{$arg{ns}}{$arg{name}} = $arg{obj}; } 1;