# -*- perl -*-
# DO NOT EDIT - This file is generated by UMMF; http://ummf.sourceforge.net 
# From template: $Id: Perl.txt,v 1.77 2006/05/14 01:40:03 kstephens Exp $

package UMMF::MOF_1_4_1;

# use 5.6.1;
use strict;
use warnings;

#################################################################
# Version
#

our $VERSION = do { my @r = (q$Revision: 1.77 $ =~ /\d+/g); sprintf "%d." . "%03d" x $#r, @r };

=head1 NAME

UMMF::MOF_1_4_1 - Model package for Model MOF 1.4.1 formal/05-05-05;

=head1 SYNOPSIS

  use UMMF::MOF_1_4_1;
  my $model = UMMF::MOF_1_4_1->model;

=head1 DESCRIPTION

This package

=head1 USAGE

=head1 EXPORT

None exported.

=head1 AUTHOR

Kurt Stephens, kstephens@users.sourceforge.net 2003/04/15

=head1 CLASSIFIERS

The following is a list of all the Classifiers and their respective Perl modules defined in this Model.


=head2 C<Model::AggregationKind>

See L<UMMF::MOF_1_4_1::Model::AggregationKind|UMMF::MOF_1_4_1::Model::AggregationKind>.


=head2 C<Model::AliasType>

See L<UMMF::MOF_1_4_1::Model::AliasType|UMMF::MOF_1_4_1::Model::AliasType>.


=head2 C<Model::Association>

See L<UMMF::MOF_1_4_1::Model::Association|UMMF::MOF_1_4_1::Model::Association>.


=head2 C<Model::AssociationEnd>

See L<UMMF::MOF_1_4_1::Model::AssociationEnd|UMMF::MOF_1_4_1::Model::AssociationEnd>.


=head2 C<Model::Attribute>

See L<UMMF::MOF_1_4_1::Model::Attribute|UMMF::MOF_1_4_1::Model::Attribute>.


=head2 C<Model::BehavioralFeature>

See L<UMMF::MOF_1_4_1::Model::BehavioralFeature|UMMF::MOF_1_4_1::Model::BehavioralFeature>.


=head2 C<Model::Boolean>

See L<UMMF::MOF_1_4_1::Model::Boolean|UMMF::MOF_1_4_1::Model::Boolean>.


=head2 C<Model::Class>

See L<UMMF::MOF_1_4_1::Model::Class|UMMF::MOF_1_4_1::Model::Class>.


=head2 C<Model::Classifier>

See L<UMMF::MOF_1_4_1::Model::Classifier|UMMF::MOF_1_4_1::Model::Classifier>.


=head2 C<Model::CollectionType>

See L<UMMF::MOF_1_4_1::Model::CollectionType|UMMF::MOF_1_4_1::Model::CollectionType>.


=head2 C<Model::Constant>

See L<UMMF::MOF_1_4_1::Model::Constant|UMMF::MOF_1_4_1::Model::Constant>.


=head2 C<Model::Constraint>

See L<UMMF::MOF_1_4_1::Model::Constraint|UMMF::MOF_1_4_1::Model::Constraint>.


=head2 C<Model::DataType>

See L<UMMF::MOF_1_4_1::Model::DataType|UMMF::MOF_1_4_1::Model::DataType>.


=head2 C<Model::DirectionKind>

See L<UMMF::MOF_1_4_1::Model::DirectionKind|UMMF::MOF_1_4_1::Model::DirectionKind>.


=head2 C<Model::Double>

See L<UMMF::MOF_1_4_1::Model::Double|UMMF::MOF_1_4_1::Model::Double>.


=head2 C<Model::EnumerationType>

See L<UMMF::MOF_1_4_1::Model::EnumerationType|UMMF::MOF_1_4_1::Model::EnumerationType>.


=head2 C<Model::EvaluationKind>

See L<UMMF::MOF_1_4_1::Model::EvaluationKind|UMMF::MOF_1_4_1::Model::EvaluationKind>.


=head2 C<Model::Exception>

See L<UMMF::MOF_1_4_1::Model::Exception|UMMF::MOF_1_4_1::Model::Exception>.


=head2 C<Model::Feature>

See L<UMMF::MOF_1_4_1::Model::Feature|UMMF::MOF_1_4_1::Model::Feature>.


=head2 C<Model::Float>

See L<UMMF::MOF_1_4_1::Model::Float|UMMF::MOF_1_4_1::Model::Float>.


=head2 C<Model::GeneralizableElement>

See L<UMMF::MOF_1_4_1::Model::GeneralizableElement|UMMF::MOF_1_4_1::Model::GeneralizableElement>.


=head2 C<Model::Import>

See L<UMMF::MOF_1_4_1::Model::Import|UMMF::MOF_1_4_1::Model::Import>.


=head2 C<Model::Integer>

See L<UMMF::MOF_1_4_1::Model::Integer|UMMF::MOF_1_4_1::Model::Integer>.


=head2 C<Model::Long>

See L<UMMF::MOF_1_4_1::Model::Long|UMMF::MOF_1_4_1::Model::Long>.


=head2 C<Model::ModelElement>

See L<UMMF::MOF_1_4_1::Model::ModelElement|UMMF::MOF_1_4_1::Model::ModelElement>.


=head2 C<Model::MultiplicityType>

See L<UMMF::MOF_1_4_1::Model::MultiplicityType|UMMF::MOF_1_4_1::Model::MultiplicityType>.


=head2 C<Model::Namespace>

See L<UMMF::MOF_1_4_1::Model::Namespace|UMMF::MOF_1_4_1::Model::Namespace>.


=head2 C<Model::Operation>

See L<UMMF::MOF_1_4_1::Model::Operation|UMMF::MOF_1_4_1::Model::Operation>.


=head2 C<Model::Package>

See L<UMMF::MOF_1_4_1::Model::Package|UMMF::MOF_1_4_1::Model::Package>.


=head2 C<Model::Parameter>

See L<UMMF::MOF_1_4_1::Model::Parameter|UMMF::MOF_1_4_1::Model::Parameter>.


=head2 C<Model::PrimitiveType>

See L<UMMF::MOF_1_4_1::Model::PrimitiveType|UMMF::MOF_1_4_1::Model::PrimitiveType>.


=head2 C<Model::Reference>

See L<UMMF::MOF_1_4_1::Model::Reference|UMMF::MOF_1_4_1::Model::Reference>.


=head2 C<Model::ScopeKind>

See L<UMMF::MOF_1_4_1::Model::ScopeKind|UMMF::MOF_1_4_1::Model::ScopeKind>.


=head2 C<Model::String>

See L<UMMF::MOF_1_4_1::Model::String|UMMF::MOF_1_4_1::Model::String>.


=head2 C<Model::StructuralFeature>

See L<UMMF::MOF_1_4_1::Model::StructuralFeature|UMMF::MOF_1_4_1::Model::StructuralFeature>.


=head2 C<Model::StructureField>

See L<UMMF::MOF_1_4_1::Model::StructureField|UMMF::MOF_1_4_1::Model::StructureField>.


=head2 C<Model::StructureType>

See L<UMMF::MOF_1_4_1::Model::StructureType|UMMF::MOF_1_4_1::Model::StructureType>.


=head2 C<Model::Tag>

See L<UMMF::MOF_1_4_1::Model::Tag|UMMF::MOF_1_4_1::Model::Tag>.


=head2 C<Model::TypedElement>

See L<UMMF::MOF_1_4_1::Model::TypedElement|UMMF::MOF_1_4_1::Model::TypedElement>.


=head2 C<Model::VisibilityKind>

See L<UMMF::MOF_1_4_1::Model::VisibilityKind|UMMF::MOF_1_4_1::Model::VisibilityKind>.


=head1 SEE ALSO

L<UMMF::Core::MetaModel|UMMF::Core::MetaModel>

=head1 VERSION

$Revision: 1.77 $

=head1 METHODS

=cut

#################################################################
# Supers
#


#################################################################
# Dependencies
#

use Carp qw(croak confess);


#################################################################
# Import them all!!!
# [ % model_package_use % ];
#


#################################################################
# Methods
#

my $factory_map = 
[
      'AggregationKind',
      'UMMF::MOF_1_4_1::Model::AggregationKind',
      'Model::AggregationKind',
      'UMMF::MOF_1_4_1::Model::AggregationKind',
      'AliasType',
      'UMMF::MOF_1_4_1::Model::AliasType',
      'Model::AliasType',
      'UMMF::MOF_1_4_1::Model::AliasType',
      'Association',
      'UMMF::MOF_1_4_1::Model::Association',
      'Model::Association',
      'UMMF::MOF_1_4_1::Model::Association',
      'AssociationEnd',
      'UMMF::MOF_1_4_1::Model::AssociationEnd',
      'Model::AssociationEnd',
      'UMMF::MOF_1_4_1::Model::AssociationEnd',
      'Attribute',
      'UMMF::MOF_1_4_1::Model::Attribute',
      'Model::Attribute',
      'UMMF::MOF_1_4_1::Model::Attribute',
      'BehavioralFeature',
      'UMMF::MOF_1_4_1::Model::BehavioralFeature',
      'Model::BehavioralFeature',
      'UMMF::MOF_1_4_1::Model::BehavioralFeature',
      'Boolean',
      'UMMF::MOF_1_4_1::Model::Boolean',
      'Model::Boolean',
      'UMMF::MOF_1_4_1::Model::Boolean',
      'Class',
      'UMMF::MOF_1_4_1::Model::Class',
      'Model::Class',
      'UMMF::MOF_1_4_1::Model::Class',
      'Classifier',
      'UMMF::MOF_1_4_1::Model::Classifier',
      'Model::Classifier',
      'UMMF::MOF_1_4_1::Model::Classifier',
      'CollectionType',
      'UMMF::MOF_1_4_1::Model::CollectionType',
      'Model::CollectionType',
      'UMMF::MOF_1_4_1::Model::CollectionType',
      'Constant',
      'UMMF::MOF_1_4_1::Model::Constant',
      'Model::Constant',
      'UMMF::MOF_1_4_1::Model::Constant',
      'Constraint',
      'UMMF::MOF_1_4_1::Model::Constraint',
      'Model::Constraint',
      'UMMF::MOF_1_4_1::Model::Constraint',
      'DataType',
      'UMMF::MOF_1_4_1::Model::DataType',
      'Model::DataType',
      'UMMF::MOF_1_4_1::Model::DataType',
      'DirectionKind',
      'UMMF::MOF_1_4_1::Model::DirectionKind',
      'Model::DirectionKind',
      'UMMF::MOF_1_4_1::Model::DirectionKind',
      'Double',
      'UMMF::MOF_1_4_1::Model::Double',
      'Model::Double',
      'UMMF::MOF_1_4_1::Model::Double',
      'EnumerationType',
      'UMMF::MOF_1_4_1::Model::EnumerationType',
      'Model::EnumerationType',
      'UMMF::MOF_1_4_1::Model::EnumerationType',
      'EvaluationKind',
      'UMMF::MOF_1_4_1::Model::EvaluationKind',
      'Model::EvaluationKind',
      'UMMF::MOF_1_4_1::Model::EvaluationKind',
      'Exception',
      'UMMF::MOF_1_4_1::Model::Exception',
      'Model::Exception',
      'UMMF::MOF_1_4_1::Model::Exception',
      'Feature',
      'UMMF::MOF_1_4_1::Model::Feature',
      'Model::Feature',
      'UMMF::MOF_1_4_1::Model::Feature',
      'Float',
      'UMMF::MOF_1_4_1::Model::Float',
      'Model::Float',
      'UMMF::MOF_1_4_1::Model::Float',
      'GeneralizableElement',
      'UMMF::MOF_1_4_1::Model::GeneralizableElement',
      'Model::GeneralizableElement',
      'UMMF::MOF_1_4_1::Model::GeneralizableElement',
      'Import',
      'UMMF::MOF_1_4_1::Model::Import',
      'Model::Import',
      'UMMF::MOF_1_4_1::Model::Import',
      'Integer',
      'UMMF::MOF_1_4_1::Model::Integer',
      'Model::Integer',
      'UMMF::MOF_1_4_1::Model::Integer',
      'Long',
      'UMMF::MOF_1_4_1::Model::Long',
      'Model::Long',
      'UMMF::MOF_1_4_1::Model::Long',
      'ModelElement',
      'UMMF::MOF_1_4_1::Model::ModelElement',
      'Model::ModelElement',
      'UMMF::MOF_1_4_1::Model::ModelElement',
      'MultiplicityType',
      'UMMF::MOF_1_4_1::Model::MultiplicityType',
      'Model::MultiplicityType',
      'UMMF::MOF_1_4_1::Model::MultiplicityType',
      'Namespace',
      'UMMF::MOF_1_4_1::Model::Namespace',
      'Model::Namespace',
      'UMMF::MOF_1_4_1::Model::Namespace',
      'Operation',
      'UMMF::MOF_1_4_1::Model::Operation',
      'Model::Operation',
      'UMMF::MOF_1_4_1::Model::Operation',
      'Package',
      'UMMF::MOF_1_4_1::Model::Package',
      'Model::Package',
      'UMMF::MOF_1_4_1::Model::Package',
      'Parameter',
      'UMMF::MOF_1_4_1::Model::Parameter',
      'Model::Parameter',
      'UMMF::MOF_1_4_1::Model::Parameter',
      'PrimitiveType',
      'UMMF::MOF_1_4_1::Model::PrimitiveType',
      'Model::PrimitiveType',
      'UMMF::MOF_1_4_1::Model::PrimitiveType',
      'Reference',
      'UMMF::MOF_1_4_1::Model::Reference',
      'Model::Reference',
      'UMMF::MOF_1_4_1::Model::Reference',
      'ScopeKind',
      'UMMF::MOF_1_4_1::Model::ScopeKind',
      'Model::ScopeKind',
      'UMMF::MOF_1_4_1::Model::ScopeKind',
      'String',
      'UMMF::MOF_1_4_1::Model::String',
      'Model::String',
      'UMMF::MOF_1_4_1::Model::String',
      'StructuralFeature',
      'UMMF::MOF_1_4_1::Model::StructuralFeature',
      'Model::StructuralFeature',
      'UMMF::MOF_1_4_1::Model::StructuralFeature',
      'StructureField',
      'UMMF::MOF_1_4_1::Model::StructureField',
      'Model::StructureField',
      'UMMF::MOF_1_4_1::Model::StructureField',
      'StructureType',
      'UMMF::MOF_1_4_1::Model::StructureType',
      'Model::StructureType',
      'UMMF::MOF_1_4_1::Model::StructureType',
      'Tag',
      'UMMF::MOF_1_4_1::Model::Tag',
      'Model::Tag',
      'UMMF::MOF_1_4_1::Model::Tag',
      'TypedElement',
      'UMMF::MOF_1_4_1::Model::TypedElement',
      'Model::TypedElement',
      'UMMF::MOF_1_4_1::Model::TypedElement',
      'VisibilityKind',
      'UMMF::MOF_1_4_1::Model::VisibilityKind',
      'Model::VisibilityKind',
      'UMMF::MOF_1_4_1::Model::VisibilityKind',
  ];

=head2 C<factory_map>

Returns an array ref that maps all UML Model names to Perl package names for this package.
Also includes short name to fully-qualified name mappings. 

=cut
sub factory_map { $factory_map; }
       
my $model;


=head2 C<model>

Returns the UML meta-model Model object for this Model.

=cut
sub model 
{
  unless ( $model ) {
    my $module = __PACKAGE__;
    $module =~ s@::@/@sg;
    my $file = $INC{$module . '.pm'};
    $file .= '.Model.xmi';
    
    if ( -s $file ) {
      print STDERR "UMMF: Reading UML Model: from $file\n";
      
      eval {
	use UMMF::Import::XMI;
	my $importer = UMMF::Import::XMI->new();
	my $results = $importer->import_input_file($file);
	($model) = grep($_->isaModel, @$results);
      };
      if ( my $exc = $@ ) {
	use UMMF;
	print STDERR "UMMF: Reading UML Model: from $file: FAILED\n";
	UMMF->bootstrapping ? warn($exc) : die($exc);
      }
    }
    
    if ( UMMF->bootstrapping && ! $model ) {
      print STDERR "UMMF: Reading UML Model: from UMMF::Boot::MetaModel\n";
      use UMMF::Boot::MetaModel;
      $model = UMMF::Boot::MetaModel->model('pure' => 1);
    }

    print STDERR "UMMF: Reading UML Model: DONE\n";
  }
  $model;
}


=head2 C<__rebless_tree>

Work around for errors like:

    Can't locate object method "parent" via package "UMMF::UML_1_5::Foundation::Core::Generalization" at /c/wct/ummf/1.0/bin/../lib/perl/UML/MetaMetaModel/Util.pm line 712.

=cut
# 'emacs
my %__rebless_tree_primitive =
map(($_ => 1),
    'HASH', 
    'ARRAY', 
    'SCALAR', 
    'CODE', 
    'GLOB',
    );

sub __rebless_tree
{
  no warnings;

  my ($x, $visited, $used) = @_;

  if ( my $ref = ref($x) ) {
    return if $visited->{$x} ++;

    # print STDERR "x = $x\n";

    # Rebless object.
    unless ( __rebless_tree_primitive{$ref} ) {
      # Does Storable::retrieve do this?
      unless ( $used->{$ref} ) {
	$used->{$ref} = 1;
	print STDERR "  use $ref\n";
	eval qq{ package main; use $ref; }; die $@ if $@;
      }

      # print STDERR "rebless $x, $ref\n";
      # REBLESS!!!
      bless($x, $ref);
    }

    # Traverse primitive
    if ( $ref eq 'Set::Object') {
      for my $y ( $x->members ) {
	__rebless_tree($y, $visited, $used);
      }
    }
    elsif ( $x =~ /HASH\(/ ) {
      for my $y ( values %$x ) {
	__rebless_tree($y, $visited, $used);
      }
    }
    elsif ( $x =~ /ARRAY\(/ ) {
      for my $y ( @$x ) {
	__rebless_tree($y, $visited, $used);
      }
    }
    elsif ( $x =~ /SCALAR\(/ ) {
      __rebless_tree($$x, $visited, $used);
    }
  }
}



my $factory;

=head2 C<factory>

Returns a factory for this Model.

=cut
sub factory 
{
  # $DB::single = 1;

  my $self = shift;
  unless ( $factory ) {
    eval q{use UMMF::Core::Factory;}; die $@ if $@;
    $factory = UMMF::Core::Factory->new('classMap' => $self->factory_map);
  }
  $factory;
}


############################################################################

1; # Is true!!!

############################################################################

### Keep these comments at end of file: kstephens@users.sourceforge.net 2003/04/06 ###
### Local Variables: ###
### mode:perl ###
### perl-indent-level:2 ###
### perl-continued-statement-offset:0 ###
### perl-brace-offset:0 ###
### perl-label-offset:0 ###
### End: ###

