2 package Moose::Autobox;
11 our $VERSION = '0.10';
15 use Moose::Autobox::Undef;
18 (shift)->SUPER::import(
19 DEFAULT => 'Moose::Autobox::',
20 UNDEF => 'Moose::Autobox::Undef',
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));
33 package Moose::Autobox::SCALAR;
35 use Moose::Autobox::Scalar;
37 use metaclass 'Moose::Meta::Class';
39 Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Scalar'));
41 *does = \&Moose::Object::does;
43 package Moose::Autobox::ARRAY;
45 use Moose::Autobox::Array;
47 use metaclass 'Moose::Meta::Class';
49 Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Array'));
51 *does = \&Moose::Object::does;
53 package Moose::Autobox::HASH;
55 use Moose::Autobox::Hash;
57 use metaclass 'Moose::Meta::Class';
59 Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Hash'));
61 *does = \&Moose::Object::does;
63 package Moose::Autobox::CODE;
65 use Moose::Autobox::Code;
67 use metaclass 'Moose::Meta::Class';
69 Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Code'));
71 *does = \&Moose::Object::does;
83 Moose::Autobox - Autoboxed wrappers for Native Perl datatypes
89 print 'Print squares from 1 to 10 : ';
90 print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ');
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.
100 =head2 A quick word about autobox
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.
110 =head2 Is this for real? or just play?
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.
119 =head2 Adding additional methods
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:
126 sub Moose::Autobox::SCALAR::bar { 42 }
130 sub SCALAR::bar { 42 }
132 as you would with vanilla autobox.
138 =item B<mixin_additional_role ($type, $role)>
140 This will mixin an additonal C<$role> into a certain C<$type>. The
141 types can be SCALAR, ARRAY, HASH or CODE.
143 This can be used to add additional methods to the types, see the
144 F<examples/units/> directory for some examples.
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
166 Stevan Little E<lt>stevan@iinteractive.comE<gt>
168 B<with contributions from:>
170 Anders (Debolaz) Nor Berle
176 =head1 COPYRIGHT AND LICENSE
178 Copyright 2006-2008 by Infinity Interactive, Inc.
180 L<http://www.iinteractive.com>
182 This library is free software; you can redistribute it and/or modify
183 it under the same terms as Perl itself.