0.06
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox.pm
1
2 package Moose::Autobox;
3
4 use strict;
5 use warnings;
6
7 use Carp        qw(confess);
8 use Scalar::Util ();
9 use Moose::Util  ();
10
11 our $VERSION = '0.06';
12
13 use base 'autobox';
14
15 use Moose::Autobox::Undef;
16
17 sub import {
18     (shift)->SUPER::import(
19         DEFAULT => 'Moose::Autobox::',
20         UNDEF   => 'Moose::Autobox::Undef',
21     );
22 }
23
24 sub mixin_additional_role {
25     my ($class, $type, $role) = @_;
26     ($type =~ /SCALAR|ARRAY|HASH|CODE/)
27         || confess "Can only add additional roles to SCALAR, ARRAY, HASH or CODE";
28     Moose::Util::apply_all_roles(('Moose::Autobox::' . $type)->meta, ($role));
29 }
30
31 {
32                         
33     package Moose::Autobox::SCALAR;
34
35     use Moose::Autobox::Scalar;
36
37     use metaclass 'Moose::Meta::Class';
38
39     Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Scalar'));
40
41     *does = \&Moose::Object::does;
42
43     package Moose::Autobox::ARRAY;
44
45     use Moose::Autobox::Array;
46
47     use metaclass 'Moose::Meta::Class';
48
49     Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Array'));
50
51     *does = \&Moose::Object::does;
52
53     package Moose::Autobox::HASH;
54
55     use Moose::Autobox::Hash;
56
57     use metaclass 'Moose::Meta::Class';
58
59     Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Hash'));
60
61     *does = \&Moose::Object::does;
62
63     package Moose::Autobox::CODE;
64
65     use Moose::Autobox::Code;
66
67     use metaclass 'Moose::Meta::Class';
68
69     Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Code'));
70
71     *does = \&Moose::Object::does;            
72  
73
74                  
75 1;
76
77 __END__
78
79 =pod
80
81 =head1 NAME 
82
83 Moose::Autobox - Autoboxed wrappers for Native Perl datatypes 
84
85 =head1 SYNOPOSIS
86
87   use Moose::Autobox;
88   
89   print 'Print squares from 1 to 10 : ';
90   print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ');
91
92 =head1 DESCRIPTION
93
94 Moose::Autobox provides an implementation of SCALAR, ARRAY, HASH
95 & CODE for use with L<autobox>. It does this using a hierarchy of 
96 roles in a manner similar to what Perl 6 I<might> do. This module, 
97 like L<Class::MOP> and L<Moose>, was inspired by my work on the 
98 Perl 6 Object Space, and the 'core types' implemented there.
99
100 =head2 A quick word about autobox
101
102 The L<autobox> module provides the ability for calling 'methods' 
103 on normal Perl values like Scalars, Arrays, Hashes and Code 
104 references. This gives the illusion that Perl's types are first-class 
105 objects. However, this is only an illusion, albeit a very nice one.
106 I created this module because L<autobox> itself does not actually 
107 provide an implementation for the Perl types but instead only provides 
108 the 'hooks' for others to add implementation too.
109
110 =head2 Is this for real? or just play?
111
112 Several people are using this module in serious applications and 
113 it seems to be quite stable. The underlying technologies of L<autobox>
114 and L<Moose::Role> are also considered stable. There is some performance
115 hit, but as I am fond of saying, nothing in life is free. If you have 
116 any questions regarding this module, either email me, or stop by #moose
117 on irc.perl.org and ask around.
118
119 =head1 METHODS
120
121 =over 4
122
123 =item B<mixin_additional_role ($type, $role)>
124
125 This will mixin an additonal C<$role> into a certain C<$type>. The 
126 types can be SCALAR, ARRAY, HASH or CODE.
127
128 This can be used to add additional methods to the types, see the 
129 F<examples/units/> directory for some examples.
130
131 =back
132
133 =head1 TODO
134
135 =over 4
136
137 =item More docs
138
139 =item More tests
140
141 =back
142   
143 =head1 BUGS
144
145 All complex software has bugs lurking in it, and this module is no 
146 exception. If you find a bug please either email me, or add the bug
147 to cpan-RT.
148
149 =head1 AUTHOR
150
151 Stevan Little E<lt>stevan@iinteractive.comE<gt>
152
153 B<with contributions from:>
154
155 Anders (Debolaz) Nor Berle
156
157 Matt (mst) Trout
158
159 renormalist
160
161 =head1 COPYRIGHT AND LICENSE
162
163 Copyright 2006-2008 by Infinity Interactive, Inc.
164
165 L<http://www.iinteractive.com>
166
167 This library is free software; you can redistribute it and/or modify
168 it under the same terms as Perl itself.
169
170 =cut