Commit | Line | Data |
8b978dd5 |
1 | |
2 | package Class::MOP::Class; |
3 | |
4 | use strict; |
5 | use warnings; |
6 | |
7 | use Carp 'confess'; |
8 | use Scalar::Util 'blessed'; |
9 | use Sub::Name 'subname'; |
10 | use B 'svref_2object'; |
11 | |
12 | our $VERSION = '0.01'; |
13 | |
14 | # Creation |
15 | |
16 | sub initialize { |
17 | my ($class, $package_name) = @_; |
18 | (defined $package_name) |
19 | || confess "You must pass a package name"; |
20 | bless \$package_name => $class; |
21 | } |
22 | |
23 | sub create { |
24 | my ($class, $package_name, $package_version, %options) = @_; |
25 | (defined $package_name) |
26 | || confess "You must pass a package name"; |
27 | my $code = "package $package_name;"; |
28 | $code .= "\$$package_name\:\:VERSION = '$package_version';" |
29 | if defined $package_version; |
30 | eval $code; |
31 | confess "creation of $package_name failed : $@" if $@; |
32 | my $meta = $package_name->meta; |
33 | $meta->superclasses(@{$options{superclasses}}) |
34 | if exists $options{superclasses}; |
35 | # ... rest to come later ... |
36 | return $meta; |
37 | } |
38 | |
39 | # Informational |
40 | |
41 | sub name { ${$_[0]} } |
42 | |
43 | sub version { |
44 | my $self = shift; |
45 | no strict 'refs'; |
46 | ${$self->name . '::VERSION'}; |
47 | } |
48 | |
49 | # Inheritance |
50 | |
51 | sub superclasses { |
52 | my $self = shift; |
53 | no strict 'refs'; |
54 | if (@_) { |
55 | my @supers = @_; |
56 | @{$self->name . '::ISA'} = @supers; |
57 | } |
58 | @{$self->name . '::ISA'}; |
59 | } |
60 | |
61 | sub class_precedence_list { |
62 | my $self = shift; |
63 | ( |
64 | $self->name, |
65 | map { |
66 | $_->meta->class_precedence_list() |
67 | } $self->superclasses() |
68 | ); |
69 | } |
70 | |
71 | ## Private Utility Methods |
72 | |
73 | # borrowed from Class::Trait 0.20 - Thanks Ovid :) |
74 | sub _find_subroutine_package { |
75 | my $sub = shift; |
76 | my $package = ''; |
77 | eval { |
78 | my $stash = svref_2object($sub)->STASH; |
79 | $package = $stash->NAME |
80 | if $stash && $stash->can('NAME'); |
81 | }; |
82 | confess "Could not determine calling package: $@" |
83 | if $@; |
84 | return $package; |
85 | } |
86 | |
87 | 1; |
88 | |
89 | __END__ |
90 | |
91 | =pod |
92 | |
93 | =head1 NAME |
94 | |
95 | Class::MOP::Class - Class Meta Object |
96 | |
97 | =head1 SYNOPSIS |
98 | |
99 | =head1 DESCRIPTION |
100 | |
101 | =head1 AUTHOR |
102 | |
103 | Stevan Little E<gt>stevan@iinteractive.comE<lt> |
104 | |
105 | =head1 COPYRIGHT AND LICENSE |
106 | |
107 | Copyright 2006 by Infinity Interactive, Inc. |
108 | |
109 | L<http://www.iinteractive.com> |
110 | |
111 | This library is free software; you can redistribute it and/or modify |
112 | it under the same terms as Perl itself. |
113 | |
114 | =cut |