bump version to 0.92
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Constructor.pm
index 8de6706..e145a48 100644 (file)
@@ -7,11 +7,11 @@ use warnings;
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken', 'looks_like_number';
 
-our $VERSION   = '0.78_02';
+our $VERSION   = '0.92';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
-use base 'Class::MOP::Method::Generated';
+use base 'Class::MOP::Method::Inlined';
 
 sub new {
     my $class   = shift;
@@ -38,22 +38,33 @@ sub new {
 
 sub _new {
     my $class = shift;
-    my $options = @_ == 1 ? $_[0] : {@_};
-
-    bless {
-        # from our superclass
-        'body'                 => undef,
-        'package_name'         => $options->{package_name},
-        'name'                 => $options->{name},        
-        # specific to this subclass
-        'options'              => $options->{options} || {},
-        'associated_metaclass' => $options->{metaclass},
-        'is_inline'            => ($options->{is_inline} || 0),
+
+    return Class::MOP::Class->initialize($class)->new_object(@_)
+        if $class ne __PACKAGE__;
+
+    my $params = @_ == 1 ? $_[0] : {@_};
+
+    return bless {
+        # inherited from Class::MOP::Method
+        body                 => $params->{body},
+        # associated_metaclass => $params->{associated_metaclass}, # overriden
+        package_name         => $params->{package_name},
+        name                 => $params->{name},
+        original_method      => $params->{original_method},
+
+        # inherited from Class::MOP::Generated
+        is_inline            => $params->{is_inline} || 0,
+        definition_context   => $params->{definition_context},
+
+        # inherited from Class::MOP::Inlined
+        _expected_method_class => $params->{_expected_method_class},
+
+        # defined in this subclass
+        options              => $params->{options} || {},
+        associated_metaclass => $params->{metaclass},
     }, $class;
 }
 
-sub can_be_inlined { 1 }
-
 ## accessors
 
 sub options              { (shift)->{'options'}              }
@@ -62,8 +73,8 @@ sub associated_metaclass { (shift)->{'associated_metaclass'} }
 ## cached values ...
 
 sub meta_instance {
-    warn 'The meta_instance method has been made private.'
-        . " The public version is deprecated and will be removed in a future release.\n";
+    Carp::cluck('The meta_instance method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
     shift->_meta_instance;
 }
 
@@ -73,9 +84,13 @@ sub _meta_instance {
 }
 
 sub attributes {
-    warn 'The attributes method is deprecated.'
-        . " Use ->associated_metaclass->get_all_attributes instead.\n";
+    Carp::cluck('The attributes method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+
+    return shift->_attributes;
+}
 
+sub _attributes {
     my $self = shift;
     $self->{'attributes'} ||= [ $self->associated_metaclass->get_all_attributes ]
 }
@@ -83,8 +98,8 @@ sub attributes {
 ## method
 
 sub initialize_body {
-    warn 'The initialize_body method has been made private.'
-        . " The public version is deprecated and will be removed in a future release.\n";
+    Carp::cluck('The initialize_body method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
     shift->_initialize_body;
 }
 
@@ -98,8 +113,8 @@ sub _initialize_body {
 }
 
 sub generate_constructor_method {
-    warn 'The generate_constructor_method method has been made private.'
-        . " The public version is deprecated and will be removed in a future release.\n";
+    Carp::cluck('The generate_constructor_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
     shift->_generate_constructor_method;
 }
 
@@ -108,8 +123,8 @@ sub _generate_constructor_method {
 }
 
 sub generate_constructor_method_inline {
-    warn 'The generate_constructor_method_inline method has been made private.'
-        . " The public version is deprecated and will be removed in a future release.\n";
+    Carp::cluck('The generate_constructor_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
     shift->_generate_constructor_method_inline;
 }
 
@@ -129,16 +144,16 @@ sub _generate_constructor_method_inline {
     $source .= "\n" . 'my $instance = ' . $self->_meta_instance->inline_create_instance('$class');
     $source .= ";\n" . (join ";\n" => map {
         $self->_generate_slot_initializer($_, $close_over)
-    } $self->associated_metaclass->get_all_attributes);
+    } @{ $self->_attributes });
     $source .= ";\n" . 'return $instance';
     $source .= ";\n" . '}';
     warn $source if $self->options->{debug};
 
-    my $code = $self->_eval_closure(
+    my ( $code, $e ) = $self->_eval_closure(
         $close_over,
         $source
     );
-    confess "Could not eval the constructor :\n\n$source\n\nbecause :\n\n$@" if $@;
+    confess "Could not eval the constructor :\n\n$source\n\nbecause :\n\n$e" if $e;
 
     return $code;
 }
@@ -172,13 +187,13 @@ sub _generate_slot_initializer {
         $default = '$instance->'.$attr->builder;
     }
 
-    if ( defined $attr->init_arg ) {
+    if ( defined(my $init_arg = $attr->init_arg) ) {
       return (
-          'if(exists $params->{\'' . $attr->init_arg . '\'}){' . "\n" .
+          'if(exists $params->{\'' . $init_arg . '\'}){' . "\n" .
                 $self->_meta_instance->inline_set_slot_value(
                     '$instance',
                     $attr->name,
-                    '$params->{\'' . $attr->init_arg . '\'}' ) . "\n" .
+                    '$params->{\'' . $init_arg . '\'}' ) . "\n" .
            '} ' . (!defined $default ? '' : 'else {' . "\n" .
                 $self->_meta_instance->inline_set_slot_value(
                     '$instance',
@@ -264,12 +279,6 @@ inlined.
 
 This returns the L<Class::MOP::Class> object for the method.
 
-=item B<< $metamethod->can_be_inlined >>
-
-This method always returns true in this class. It exists so that
-subclasses (as in Moose) can do some sort of checking to determine
-whether or not inlining the constructor is safe.
-
 =back
 
 =head1 AUTHORS