X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FModule.pm;h=30f7b8a56047e4d860fdc116c805ef877d5b98e6;hb=3a6833503c4b132d636f048ceecba7ef4fbbc210;hp=58e712a8309198c5a1d00aa0739d4f9a430d1348;hpb=2cea7a5fabbf2a81e0518c3f967706c9428afa8d;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Module.pm b/lib/Mouse/Meta/Module.pm index 58e712a..30f7b8a 100755 --- a/lib/Mouse/Meta/Module.pm +++ b/lib/Mouse/Meta/Module.pm @@ -5,67 +5,69 @@ 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}; - } +my %METAS; - sub initialize { - my($class, $package_name, @args) = @_; +# 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 $METAS{$name}; +} - ($package_name && !ref($package_name)) - || $class->throw_error("You must pass a package name and it cannot be blessed"); +sub initialize { + my($class, $package_name, @args) = @_; - return $METACLASS_CACHE{$package_name} - ||= $class->_construct_meta(package => $package_name, @args); - } + ($package_name && !ref($package_name)) + || $class->throw_error("You must pass a package name and it cannot be blessed"); - 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]} } + return $METAS{$package_name} + ||= $class->_construct_meta(package => $package_name, @args); +} +sub class_of{ + my($class_or_instance) = @_; + return undef unless defined $class_or_instance; + return $METAS{ ref($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 { %METAS } +sub get_all_metaclass_instances { values %METAS } +sub get_all_metaclass_names { keys %METAS } +sub get_metaclass_by_name { $METAS{$_[0]} } +#sub store_metaclass_by_name { $METAS{$_[0]} = $_[1] } +#sub weaken_metaclass { weaken($METAS{$_[0]}) } +#sub does_metaclass_exist { defined $METAS{$_[0]} } +#sub remove_metaclass_by_name { delete $METAS{$_[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 -sub get_attribute_map { $_[0]->{attributes} } +sub get_attribute_map { + Carp::cluck('get_attribute_map() has been deprecated'); + return $_[0]->{attributes}; +} + sub has_attribute { exists $_[0]->{attributes}->{$_[1]} } sub get_attribute { $_[0]->{attributes}->{$_[1]} } sub get_attribute_list{ keys %{$_[0]->{attributes}} } @@ -99,20 +101,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 +224,7 @@ sub get_method_list { )}; my $meta = $class->initialize( $package_name, %initialize_options, @extra_options); - Mouse::Meta::Module::weaken_metaclass($package_name) + weaken $METAS{$package_name} if $mortal; # FIXME totally lame @@ -272,7 +279,7 @@ sub get_method_list { @{$self->{superclasses}} = () if exists $self->{superclasses}; %{$stash} = (); - Mouse::Meta::Module::remove_metaclass_by_name($self->name); + delete $METAS{$self->name}; no strict 'refs'; delete ${$ANON_PREFIX}{ $serial_id . '::' }; @@ -301,7 +308,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