Move M::Util::(version|authority|identifier) to M::Meta::Module
[gitmo/Mouse.git] / lib / Mouse / Meta / Module.pm
CommitLineData
3a63a2e7 1package Mouse::Meta::Module;
2use strict;
3use warnings;
4
5use Scalar::Util qw/blessed weaken/;
23264b5b 6use Mouse::Util qw/get_code_info/;
3a63a2e7 7use Carp 'confess';
8
9sub name { $_[0]->{package} }
10sub _method_map{ $_[0]->{methods} }
11
23264b5b 12
13sub version { no strict 'refs'; ${shift->name.'::VERSION'} }
14sub authority { no strict 'refs'; ${shift->name.'::AUTHORITY'} }
15sub identifier {
16 my $self = shift;
17 return join '-' => (
18 $self->name,
19 ($self->version || ()),
20 ($self->authority || ()),
21 );
22}
23
24
3a63a2e7 25sub namespace{
26 my $name = $_[0]->{package};
27 no strict 'refs';
28 return \%{ $name . '::' };
29}
30
31sub add_method {
32 my($self, $name, $code) = @_;
33
34 if(!defined $name){
35 confess "You must pass a defined name";
36 }
37 if(ref($code) ne 'CODE'){
38 confess "You must pass a CODE reference";
39 }
40
41 $self->_method_map->{$name}++; # Moose stores meta object here.
42
43 my $pkg = $self->name;
44 no strict 'refs';
45 no warnings 'redefine';
46 *{ $pkg . '::' . $name } = $code;
47}
48
49sub _code_is_mine { # taken from Class::MOP::Class\r
50 my ( $self, $code ) = @_;\r
51\r
52 my ( $code_package, $code_name ) = get_code_info($code);\r
53\r
54 return $code_package && $code_package eq $self->name\r
55 || ( $code_package eq 'constant' && $code_name eq '__ANON__' );\r
56}
57
58sub has_method {
59 my($self, $method_name) = @_;
60
61 return 1 if $self->_method_map->{$method_name};
62 my $code = $self->name->can($method_name);
63
64 return $code && $self->_code_is_mine($code);
65}
66
67
68
69sub get_method_list {\r
70 my($self) = @_;
71\r
72 return grep { $self->has_method($_) } keys %{ $self->namespace };\r
73}
74
75sub get_attribute_map { $_[0]->{attributes} }
76sub has_attribute { exists $_[0]->{attributes}->{$_[1]} }
77sub get_attribute { $_[0]->{attributes}->{$_[1]} }
78sub get_attribute_list {
79 my $self = shift;
80 keys %{$self->get_attribute_map};
81}
82
83
841;
85
86__END__
87
88=head1 NAME
89
90Mouse::Meta::Module - Common base class for Mouse::Meta::Class and Mouse::Meta::Role
91
92=cut