X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FModule.pm;h=aac7e811b527340c199bb200d9102dc213af0829;hb=dd2d7f1ac8669339759624c875ce997ca26bd64f;hp=58e712a8309198c5a1d00aa0739d4f9a430d1348;hpb=2cea7a5fabbf2a81e0518c3f967706c9428afa8d;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Module.pm b/lib/Mouse/Meta/Module.pm index 58e712a..aac7e81 100755 --- a/lib/Mouse/Meta/Module.pm +++ b/lib/Mouse/Meta/Module.pm @@ -5,63 +5,61 @@ use warnings; use Carp (); use Scalar::Util qw/blessed weaken/; -use Mouse::Util qw/get_code_info not_supported load_class/; +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 }; } -sub meta{ Mouse::Meta::Class->initialize(ref $_[0] || $_[0]) } +# 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 _new{ Carp::croak("Mouse::Meta::Module is an abstract class") } 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 @@ -99,20 +97,25 @@ sub add_method { *{ $pkg . '::' . $name } = $code; } -sub _code_is_mine { # taken from Class::MOP::Class - my ( $self, $code ) = @_; +# XXX: for backward compatibility +my %foreign = map{ $_ => undef } qw( + Mouse Mouse::Role Mouse::Util Mouse::Util::TypeConstraints + Carp Scalar::Util +); +sub _code_is_mine{ + my($self, $code) = @_; - my ( $code_package, $code_name ) = get_code_info($code); + my $package = get_code_package($code); - return $code_package && $code_package eq $self->name - || ( $code_package eq 'constant' && $code_name eq '__ANON__' ); + return !exists $foreign{$package}; } sub has_method { my($self, $method_name) = @_; return 1 if $self->{methods}->{$method_name}; - my $code = $self->name->can($method_name); + + my $code = do{ no strict 'refs'; *{$self->{package} . '::' . $method_name}{CODE} }; return $code && $self->_code_is_mine($code); } @@ -217,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 @@ -272,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 . '::' }; @@ -301,7 +304,15 @@ __END__ =head1 NAME -Mouse::Meta::Module - Common base class for Mouse::Meta::Class and Mouse::Meta::Role +Mouse::Meta::Module - The base class for Mouse::Meta::Class and Mouse::Meta::Role + +=head1 SEE ALSO + +L + +L + +L =cut