X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStrictConstructor.pm;h=a1c4a5df93a5626589aa73305a5c7050069c8696;hb=c633cb7eb8afdc527a3e03d26e889a162b57437e;hp=ea1f71964e5927bb03f7279af9ff16781a1cbfcf;hpb=a83dec4353207816d24e09f0f3a7afc2200369c4;p=gitmo%2FMooseX-StrictConstructor.git diff --git a/lib/MooseX/StrictConstructor.pm b/lib/MooseX/StrictConstructor.pm index ea1f719..a1c4a5d 100644 --- a/lib/MooseX/StrictConstructor.pm +++ b/lib/MooseX/StrictConstructor.pm @@ -3,30 +3,57 @@ package MooseX::StrictConstructor; use strict; use warnings; -our $VERSION = '0.04'; +our $VERSION = '0.06_01'; +$VERSION = eval $VERSION; -use Moose; -use MooseX::Object::StrictConstructor; +use Class::MOP (); +use Moose (); +use Moose::Exporter; +use MooseX::StrictConstructor::Role::Object; +use MooseX::StrictConstructor::Role::Metaclass; +Moose::Exporter->setup_import_methods( also => 'Moose' ); -sub import +sub init_meta { - my $caller = caller(); - - return if $caller eq 'main'; - - Moose::init_meta( $caller, - 'MooseX::Object::StrictConstructor', - 'MooseX::StrictConstructor::Meta::Class', - ); - - Moose->import( { into => $caller } ); - - return; + shift; + my %p = @_; + + Moose->init_meta(%p); + + my $caller = $p{for_class}; + + my $metameta = $caller->meta()->meta(); + unless ( $metameta->can('does_role') + && $metameta->does_role( 'MooseX::StrictConstructor::Role::Metaclass' ) ) + { + my $new_meta = + Moose::Meta::Class->create_anon_class + ( superclasses => [ ref $caller->meta() ], + roles => [ 'MooseX::StrictConstructor::Role::Metaclass' ], + cache => 1, + ); + + Class::MOP::remove_metaclass_by_name($caller); + + $new_meta->name()->initialize($caller); + } + + unless ( $caller->meta()->does_role('MooseX::StrictConstructor::Role::Object') ) + { + my $new_base = + Moose::Meta::Class->create_anon_class + ( superclasses => [ $caller->meta()->superclasses() ], + roles => [ 'MooseX::StrictConstructor::Role::Object' ], + cache => 1, + ); + + $caller->meta()->superclasses( $new_base->name() ); + } + + return $caller->meta(); } - - 1; __END__