6a3497b2879d9c0454729df564096b44785173cc
[gitmo/Class-MOP.git] / lib / metaclass.pm
1
2 package metaclass;
3
4 use strict;
5 use warnings;
6
7 use Carp         'confess';
8 use Scalar::Util 'blessed';
9
10 our $VERSION   = '0.63';
11 our $AUTHORITY = 'cpan:STEVAN';
12
13 use Class::MOP;
14
15 sub import {
16     shift;
17     my $metaclass;
18     if (!defined($_[0]) || $_[0] =~ /^(attribute|method|instance)_metaclass/) {
19         $metaclass = 'Class::MOP::Class';
20     }
21     else {
22         $metaclass = shift;
23         #make sure the custom metaclass gets loaded
24         Class::MOP::load_class($metaclass);
25         ($metaclass->isa('Class::MOP::Class'))
26             || confess "The metaclass ($metaclass) must be derived from Class::MOP::Class";
27     }
28     my %options = @_;
29     
30     # make sure the custom metaclasses get loaded
31     foreach my $class (grep { 
32                             /^(attribute|method|instance)_metaclass/ 
33                         } keys %options) {
34         Class::MOP::load_class($options{$class})
35     }
36
37     my $package = caller();
38
39     # create a meta object so we can install &meta
40     my $meta = $metaclass->initialize($package => %options);
41     $meta->add_method('meta' => sub {
42         # we must re-initialize so that it
43         # works as expected in subclasses,
44         # since metaclass instances are
45         # singletons, this is not really a
46         # big deal anyway.
47         $metaclass->initialize((blessed($_[0]) || $_[0]) => %options)
48     });
49 }
50
51 1;
52
53 __END__
54
55 =pod
56
57 =head1 NAME
58
59 metaclass - a pragma for installing and using Class::MOP metaclasses
60
61 =head1 SYNOPSIS
62
63   package MyClass;
64
65   # use Class::MOP::Class
66   use metaclass;
67
68   # ... or use a custom metaclass
69   use metaclass 'MyMetaClass';
70
71   # ... or use a custom metaclass
72   # and custom attribute and method
73   # metaclasses
74   use metaclass 'MyMetaClass' => (
75       'attribute_metaclass' => 'MyAttributeMetaClass',
76       'method_metaclass'    => 'MyMethodMetaClass',
77   );
78
79   # ... or just specify custom attribute
80   # and method classes, and Class::MOP::Class
81   # is the assumed metaclass
82   use metaclass (
83       'attribute_metaclass' => 'MyAttributeMetaClass',
84       'method_metaclass'    => 'MyMethodMetaClass',
85   );
86
87 =head1 DESCRIPTION
88
89 This is a pragma to make it easier to use a specific metaclass
90 and a set of custom attribute and method metaclasses. It also
91 installs a C<meta> method to your class as well.
92
93 =head1 AUTHORS
94
95 Stevan Little E<lt>stevan@iinteractive.comE<gt>
96
97 =head1 COPYRIGHT AND LICENSE
98
99 Copyright 2006-2008 by Infinity Interactive, Inc.
100
101 L<http://www.iinteractive.com>
102
103 This library is free software; you can redistribute it and/or modify
104 it under the same terms as Perl itself.
105
106 =cut