0.04
[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
10 our $VERSION = '0.04';
11
12 use base 'autobox';
13
14 use Moose::Autobox::Undef;
15
16 sub import {
17     (shift)->SUPER::import(
18         DEFAULT => 'Moose::Autobox::',
19         UNDEF   => 'Moose::Autobox::Undef',
20     );
21 }
22
23 sub mixin_additional_role {
24     my ($class, $type, $role) = @_;
25     ($type =~ /SCALAR|ARRAY|HASH|CODE/)
26         || confess "Can only add additional roles to SCALAR, ARRAY, HASH or CODE";
27     ('Moose::Autobox::' . $type)->meta->_apply_all_roles($role);
28 }
29
30 {
31                         
32     package Moose::Autobox::SCALAR;
33     # NOTE:
34     # this doesnt make sense, but 
35     # I need to prevent Moose from 
36     # assiging to @ISA
37     use base 'UNIVERSAL';
38     use Moose;
39     with 'Moose::Autobox::Scalar';
40
41     *does = \&Moose::Object::does;
42
43     package Moose::Autobox::ARRAY;
44     use base 'UNIVERSAL';
45     use Moose;
46     with 'Moose::Autobox::Array';
47
48     *does = \&Moose::Object::does;
49
50     package Moose::Autobox::HASH;
51     use base 'UNIVERSAL';
52     use Moose;
53     with 'Moose::Autobox::Hash';
54
55     *does = \&Moose::Object::does;
56
57     package Moose::Autobox::CODE;
58     use base 'UNIVERSAL';
59     use Moose;
60     with 'Moose::Autobox::Code';  
61
62     *does = \&Moose::Object::does;            
63  
64
65                  
66 1;
67
68 __END__
69
70 =pod
71
72 =head1 NAME 
73
74 Moose::Autobox - Ruby ain't got nothin on us
75
76 =head1 SYNOPOSIS
77
78   use Moose::Autobox;
79   
80   print 'Print squares from 1 to 10 : ';
81   print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ');
82
83 =head1 CAVEAT
84
85 First, a warning.
86
87 This module is very very very very very very very experimental. It 
88 makes use of a very experimental module (L<autobox>) and uses some 
89 shiney new technology (L<Moose::Role>) to accomplish it's goals.
90
91 Use this at your own risk. If it breaks the lamp in the living room
92 and your mother yells at you, don't come complaining to me.
93
94 Also, as this is so experimental, it's API should not be considered 
95 to be stable. It could very well change in radical ways.
96
97 =head1 DESCRIPTION
98
99 Moose::Autobox provides an implementation of SCALAR, ARRAY, HASH
100 & CODE for use with L<autobox>. It does this using a hierarchy of 
101 roles in a manner similar to what Perl 6 I<might> do. This module, 
102 like L<Class::MOP> and L<Moose>, was inspired by my work on the 
103 Perl 6 Object Space, and the 'core types' implemented there.
104
105 =head2 A quick word about autobox
106
107 The L<autobox> module provides the ability for calling 'methods' 
108 on normal Perl values like Scalars, Arrays, Hashes and Code 
109 references. This gives the illusion that Perl's types are first-class 
110 objects. However, this is only an illusion, albeit a very nice one.
111 I created this module because L<autobox> itself does not actually 
112 provide an implementation for the Perl types but instead only provides 
113 the 'hooks' for others to add implementation too.
114
115 =head2 Is this for real? or just play?
116
117 My intent is to try and make this module as production worthy as 
118 possible. This may or may not be possible, depending on how well 
119 L<autobox> works out. At this point, I have high hopes for things
120 but only time (and more tests and code) will tell.
121
122 =head1 METHODS
123
124 =over 4
125
126 =item B<mixin_additional_role ($type, $role)>
127
128 This will mixin an additonal C<$role> into a certain C<$type>. The 
129 types can be SCALAR, ARRAY, HASH or CODE.
130
131 This can be used to add additional methods to the types, see the 
132 F<examples/units/> directory for some examples.
133
134 =back
135
136 =head1 TODO
137
138 =over 4
139
140 =item More docs
141
142 =item More tests
143
144 =back
145   
146 =head1 BUGS
147
148 All complex software has bugs lurking in it, and this module is no 
149 exception. If you find a bug please either email me, or add the bug
150 to cpan-RT.
151
152 =head1 AUTHOR
153
154 Stevan Little E<lt>stevan@iinteractive.comE<gt>
155
156 B<with contributions from:>
157
158 Anders (Debolaz) Nor Berle
159
160 Matt (mst) Trout
161
162 renormalist
163
164 =head1 COPYRIGHT AND LICENSE
165
166 Copyright 2006-2007 by Infinity Interactive, Inc.
167
168 L<http://www.iinteractive.com>
169
170 This library is free software; you can redistribute it and/or modify
171 it under the same terms as Perl itself.
172
173 =cut