X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FModule.pm;h=aac7e811b527340c199bb200d9102dc213af0829;hp=c1364bc12c73785d2ec3e4e0b7b3f51374d2a539;hb=739525d0421188856c45329c8f001e9fbe0b30b2;hpb=b61e0c46b2d97c1363692dc93a40aa8195a4523a diff --git a/lib/Mouse/Meta/Module.pm b/lib/Mouse/Meta/Module.pm index c1364bc..aac7e81 100755 --- a/lib/Mouse/Meta/Module.pm +++ b/lib/Mouse/Meta/Module.pm @@ -7,57 +7,59 @@ use Scalar::Util qw/blessed weaken/; use Mouse::Util qw/:meta get_code_package not_supported load_class/; -{ - my %METACLASS_CACHE; - - # because Mouse doesn't introspect existing classes, we're forced to - # only pay attention to other Mouse classes - sub _metaclass_cache { - my($class, $name) = @_; - return $METACLASS_CACHE{$name}; - } - sub initialize { - my($class, $package_name, @args) = @_; +my %METACLASS_CACHE; - ($package_name && !ref($package_name)) - || $class->throw_error("You must pass a package name and it cannot be blessed"); +# because Mouse doesn't introspect existing classes, we're forced to +# only pay attention to other Mouse classes +sub _metaclass_cache { + my($class, $name) = @_; + return $METACLASS_CACHE{$name}; +} - return $METACLASS_CACHE{$package_name} - ||= $class->_construct_meta(package => $package_name, @args); - } +sub initialize { + my($class, $package_name, @args) = @_; - sub class_of{ - my($class_or_instance) = @_; - return undef unless defined $class_or_instance; - return $METACLASS_CACHE{ blessed($class_or_instance) || $class_or_instance }; - } + ($package_name && !ref($package_name)) + || $class->throw_error("You must pass a package name and it cannot be blessed"); - # Means of accessing all the metaclasses that have - # been initialized thus far - sub get_all_metaclasses { %METACLASS_CACHE } - sub get_all_metaclass_instances { values %METACLASS_CACHE } - sub get_all_metaclass_names { keys %METACLASS_CACHE } - sub get_metaclass_by_name { $METACLASS_CACHE{$_[0]} } - sub store_metaclass_by_name { $METACLASS_CACHE{$_[0]} = $_[1] } - sub weaken_metaclass { weaken($METACLASS_CACHE{$_[0]}) } - sub does_metaclass_exist { defined $METACLASS_CACHE{$_[0]} } - sub remove_metaclass_by_name { delete $METACLASS_CACHE{$_[0]} } + return $METACLASS_CACHE{$package_name} + ||= $class->_construct_meta(package => $package_name, @args); +} +sub class_of{ + my($class_or_instance) = @_; + return undef unless defined $class_or_instance; + return $METACLASS_CACHE{ blessed($class_or_instance) || $class_or_instance }; } +# Means of accessing all the metaclasses that have +# been initialized thus far +#sub get_all_metaclasses { %METACLASS_CACHE } +sub get_all_metaclass_instances { values %METACLASS_CACHE } +sub get_all_metaclass_names { keys %METACLASS_CACHE } +sub get_metaclass_by_name { $METACLASS_CACHE{$_[0]} } +#sub store_metaclass_by_name { $METACLASS_CACHE{$_[0]} = $_[1] } +#sub weaken_metaclass { weaken($METACLASS_CACHE{$_[0]}) } +#sub does_metaclass_exist { defined $METACLASS_CACHE{$_[0]} } +#sub remove_metaclass_by_name { delete $METACLASS_CACHE{$_[0]} } + + + sub name { $_[0]->{package} } -sub version { no strict 'refs'; ${shift->name.'::VERSION'} } -sub authority { no strict 'refs'; ${shift->name.'::AUTHORITY'} } -sub identifier { - my $self = shift; - return join '-' => ( - $self->name, - ($self->version || ()), - ($self->authority || ()), - ); -} +# The followings are Class::MOP specific methods + +#sub version { no strict 'refs'; ${shift->name.'::VERSION'} } +#sub authority { no strict 'refs'; ${shift->name.'::AUTHORITY'} } +#sub identifier { +# my $self = shift; +# return join '-' => ( +# $self->name, +# ($self->version || ()), +# ($self->authority || ()), +# ); +#} # add_attribute is an abstract method @@ -218,7 +220,7 @@ sub get_method_list { )}; my $meta = $class->initialize( $package_name, %initialize_options, @extra_options); - Mouse::Meta::Module::weaken_metaclass($package_name) + weaken $METACLASS_CACHE{$package_name} if $mortal; # FIXME totally lame @@ -273,7 +275,7 @@ sub get_method_list { @{$self->{superclasses}} = () if exists $self->{superclasses}; %{$stash} = (); - Mouse::Meta::Module::remove_metaclass_by_name($self->name); + delete $METACLASS_CACHE{$self->name}; no strict 'refs'; delete ${$ANON_PREFIX}{ $serial_id . '::' };