use Carp qw(confess);
use Scalar::Util ();
-our $VERSION = '0.01';
-
-#sub import {
-# eval q|
-package SCALAR;
+our $VERSION = '0.04';
+
+use base 'autobox';
+
+use Moose::Autobox::Undef;
+
+sub import {
+ (shift)->SUPER::import(
+ DEFAULT => 'Moose::Autobox::',
+ UNDEF => 'Moose::Autobox::Undef',
+ );
+}
+
+sub mixin_additional_role {
+ my ($class, $type, $role) = @_;
+ ($type =~ /SCALAR|ARRAY|HASH|CODE/)
+ || confess "Can only add additional roles to SCALAR, ARRAY, HASH or CODE";
+ ('Moose::Autobox::' . $type)->meta->_apply_all_roles($role);
+}
+
+{
+
+ package Moose::Autobox::SCALAR;
+ # NOTE:
+ # this doesnt make sense, but
+ # I need to prevent Moose from
+ # assiging to @ISA
+ use base 'UNIVERSAL';
+ use Moose;
+ with 'Moose::Autobox::Scalar';
+
+ *does = \&Moose::Object::does;
+
+ package Moose::Autobox::ARRAY;
+ use base 'UNIVERSAL';
+ use Moose;
+ with 'Moose::Autobox::Array';
+
+ *does = \&Moose::Object::does;
+
+ package Moose::Autobox::HASH;
+ use base 'UNIVERSAL';
+ use Moose;
+ with 'Moose::Autobox::Hash';
+
+ *does = \&Moose::Object::does;
+
+ package Moose::Autobox::CODE;
+ use base 'UNIVERSAL';
+ use Moose;
+ with 'Moose::Autobox::Code';
+
+ *does = \&Moose::Object::does;
+
+}
+
+1;
-# NOTE:
-# this doesnt make sense, but
-# I need to prevent Moose from
-# assiging to @ISA
-use base 'Moose::Autobox';
+__END__
-use Moose;
-with 'Moose::Autobox::Scalar';
+=pod
-*does = \&Moose::Object::does;
+=head1 NAME
-package ARRAY;
-use base 'Moose::Autobox';
-use Moose;
-with 'Moose::Autobox::Array';
+Moose::Autobox - Ruby ain't got nothin on us
-*does = \&Moose::Object::does;
+=head1 SYNOPOSIS
-package HASH;
-use base 'Moose::Autobox';
-use Moose;
-with 'Moose::Autobox::Hash';
+ use Moose::Autobox;
+
+ print 'Print squares from 1 to 10 : ';
+ print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ');
-*does = \&Moose::Object::does;
+=head1 CAVEAT
-package CODE;
-use base 'Moose::Autobox';
-use Moose;
-with 'Moose::Autobox::Code';
+First, a warning.
-*does = \&Moose::Object::does;
-
-# |;
-# confess 'Could not create autobox packages because - ' . $@ if $@;
-#}
+This module is very very very very very very very experimental. It
+makes use of a very experimental module (L<autobox>) and uses some
+shiney new technology (L<Moose::Role>) to accomplish it's goals.
-1;
+Use this at your own risk. If it breaks the lamp in the living room
+and your mother yells at you, don't come complaining to me.
-__END__
+Also, as this is so experimental, it's API should not be considered
+to be stable. It could very well change in radical ways.
-=pod
+=head1 DESCRIPTION
-=head1 NAME
+Moose::Autobox provides an implementation of SCALAR, ARRAY, HASH
+& CODE for use with L<autobox>. It does this using a hierarchy of
+roles in a manner similar to what Perl 6 I<might> do. This module,
+like L<Class::MOP> and L<Moose>, was inspired by my work on the
+Perl 6 Object Space, and the 'core types' implemented there.
-Moose::Autobox - autoboxed for her pleasure
+=head2 A quick word about autobox
-=head1 SYNOPOSIS
+The L<autobox> module provides the ability for calling 'methods'
+on normal Perl values like Scalars, Arrays, Hashes and Code
+references. This gives the illusion that Perl's types are first-class
+objects. However, this is only an illusion, albeit a very nice one.
+I created this module because L<autobox> itself does not actually
+provide an implementation for the Perl types but instead only provides
+the 'hooks' for others to add implementation too.
- use Moose::Autobox;
- use autobox;
-
- 'Print squares from 1 to 10'->print;
- [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ')->print;
+=head2 Is this for real? or just play?
-=head1 DESCRIPTION
+My intent is to try and make this module as production worthy as
+possible. This may or may not be possible, depending on how well
+L<autobox> works out. At this point, I have high hopes for things
+but only time (and more tests and code) will tell.
-=head1 ROLES
-
- +------------------------+-------------------------------+
- | Identity | Behavioral |
- +------------------------+-------------------------------+
- | Item | |
- | Undef | |
- | Defined | |
- | Scalar* <-|- String, Number <--+ |
- | Ref | |-- Value |
- | Array* <-|- List <------------+ |
- | Hash* | |
- | Code* | |
- | | |
- +------------------------+-------------------------------+
-
- * indicates actual autoboxed types
-
-=head1 NOTES
-
- - String, Number & List are currently the only Values.
-
- - Indexed is pretty much an interface, we probably will
- need more of these (see Smalltalk Collection Trait
- Refactoring)
+=head1 METHODS
+
+=over 4
+
+=item B<mixin_additional_role ($type, $role)>
+
+This will mixin an additonal C<$role> into a certain C<$type>. The
+types can be SCALAR, ARRAY, HASH or CODE.
+
+This can be used to add additional methods to the types, see the
+F<examples/units/> directory for some examples.
+
+=back
+
+=head1 TODO
+
+=over 4
+
+=item More docs
+
+=item More tests
+
+=back
=head1 BUGS
Stevan Little E<lt>stevan@iinteractive.comE<gt>
+B<with contributions from:>
+
+Anders (Debolaz) Nor Berle
+
+Matt (mst) Trout
+
+renormalist
+
=head1 COPYRIGHT AND LICENSE
-Copyright 2006 by Infinity Interactive, Inc.
+Copyright 2006-2007 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>