Commit | Line | Data |
5f654d8e |
1 | |
2 | package Moose::Autobox; |
3 | |
4 | use strict; |
5 | use warnings; |
6 | |
31d40d73 |
7 | use Carp qw(confess); |
5f654d8e |
8 | use Scalar::Util (); |
ea4e64bf |
9 | use Moose::Util (); |
5f654d8e |
10 | |
7f9d7a3a |
11 | our $VERSION = '0.07'; |
7dad2765 |
12 | |
13 | use base 'autobox'; |
14 | |
19b62758 |
15 | use Moose::Autobox::Undef; |
16 | |
8937074a |
17 | sub import { |
7dad2765 |
18 | (shift)->SUPER::import( |
19 | DEFAULT => 'Moose::Autobox::', |
20 | UNDEF => 'Moose::Autobox::Undef', |
21 | ); |
22 | } |
7dad2765 |
23 | |
244bd352 |
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"; |
1401ddb2 |
28 | Moose::Util::apply_all_roles(('Moose::Autobox::' . $type)->meta, ($role)); |
244bd352 |
29 | } |
7dad2765 |
30 | |
244bd352 |
31 | { |
32 | |
33 | package Moose::Autobox::SCALAR; |
ee6bd664 |
34 | |
35 | use Moose::Autobox::Scalar; |
36 | |
37 | use metaclass 'Moose::Meta::Class'; |
38 | |
1401ddb2 |
39 | Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Scalar')); |
244bd352 |
40 | |
41 | *does = \&Moose::Object::does; |
42 | |
43 | package Moose::Autobox::ARRAY; |
ee6bd664 |
44 | |
45 | use Moose::Autobox::Array; |
46 | |
47 | use metaclass 'Moose::Meta::Class'; |
48 | |
1401ddb2 |
49 | Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Array')); |
244bd352 |
50 | |
51 | *does = \&Moose::Object::does; |
52 | |
53 | package Moose::Autobox::HASH; |
ee6bd664 |
54 | |
55 | use Moose::Autobox::Hash; |
56 | |
57 | use metaclass 'Moose::Meta::Class'; |
58 | |
1401ddb2 |
59 | Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Hash')); |
244bd352 |
60 | |
61 | *does = \&Moose::Object::does; |
62 | |
63 | package Moose::Autobox::CODE; |
ee6bd664 |
64 | |
65 | use Moose::Autobox::Code; |
66 | |
67 | use metaclass 'Moose::Meta::Class'; |
68 | |
1401ddb2 |
69 | Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Code')); |
244bd352 |
70 | |
71 | *does = \&Moose::Object::does; |
72 | |
73 | } |
7dad2765 |
74 | |
5f654d8e |
75 | 1; |
76 | |
77 | __END__ |
78 | |
79 | =pod |
80 | |
81 | =head1 NAME |
82 | |
ea4e64bf |
83 | Moose::Autobox - Autoboxed wrappers for Native Perl datatypes |
5f654d8e |
84 | |
85 | =head1 SYNOPOSIS |
86 | |
39894c95 |
87 | use Moose::Autobox; |
31d40d73 |
88 | |
8937074a |
89 | print 'Print squares from 1 to 10 : '; |
90 | print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', '); |
91 | |
5f654d8e |
92 | =head1 DESCRIPTION |
93 | |
8937074a |
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 | |
ea4e64bf |
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. |
8937074a |
118 | |
7f9d7a3a |
119 | =head2 Adding additional methods |
120 | |
121 | B<Moose::Autobox> asks L<autobox> to use the B<Moose::Autobox::*> namespace |
122 | prefix so as to avoid stepping on the toes of other L<autobox> modules. This |
123 | means that if you want to add methods to a particular perl type |
124 | (i.e. - monkeypatch), then you must do this: |
125 | |
126 | sub Moose::Autobox::SCALAR::bar { 42 } |
127 | |
128 | instead of this: |
129 | |
130 | sub SCALAR::bar { 42 |
131 | |
132 | as you would with vanilla autobox. |
133 | |
244bd352 |
134 | =head1 METHODS |
135 | |
136 | =over 4 |
137 | |
138 | =item B<mixin_additional_role ($type, $role)> |
139 | |
140 | This will mixin an additonal C<$role> into a certain C<$type>. The |
141 | types can be SCALAR, ARRAY, HASH or CODE. |
142 | |
143 | This can be used to add additional methods to the types, see the |
144 | F<examples/units/> directory for some examples. |
145 | |
146 | =back |
1972aa1b |
147 | |
148 | =head1 TODO |
149 | |
150 | =over 4 |
151 | |
152 | =item More docs |
153 | |
154 | =item More tests |
155 | |
156 | =back |
31d40d73 |
157 | |
5f654d8e |
158 | =head1 BUGS |
159 | |
160 | All complex software has bugs lurking in it, and this module is no |
161 | exception. If you find a bug please either email me, or add the bug |
162 | to cpan-RT. |
163 | |
164 | =head1 AUTHOR |
165 | |
166 | Stevan Little E<lt>stevan@iinteractive.comE<gt> |
167 | |
b3cb7038 |
168 | B<with contributions from:> |
169 | |
170 | Anders (Debolaz) Nor Berle |
171 | |
172 | Matt (mst) Trout |
173 | |
174 | renormalist |
175 | |
5f654d8e |
176 | =head1 COPYRIGHT AND LICENSE |
177 | |
ea4e64bf |
178 | Copyright 2006-2008 by Infinity Interactive, Inc. |
5f654d8e |
179 | |
180 | L<http://www.iinteractive.com> |
181 | |
182 | This library is free software; you can redistribute it and/or modify |
183 | it under the same terms as Perl itself. |
184 | |
5f654d8e |
185 | =cut |