2 package Moose::Autobox;
11 our $VERSION = '0.06';
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.
123 =item B<mixin_additional_role ($type, $role)>
125 This will mixin an additonal C<$role> into a certain C<$type>. The
126 types can be SCALAR, ARRAY, HASH or CODE.
128 This can be used to add additional methods to the types, see the
129 F<examples/units/> directory for some examples.
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
151 Stevan Little E<lt>stevan@iinteractive.comE<gt>
153 B<with contributions from:>
155 Anders (Debolaz) Nor Berle
161 =head1 COPYRIGHT AND LICENSE
163 Copyright 2006-2008 by Infinity Interactive, Inc.
165 L<http://www.iinteractive.com>
167 This library is free software; you can redistribute it and/or modify
168 it under the same terms as Perl itself.