use Carp 'confess';
use Scalar::Util 'blessed', 'weaken', 'looks_like_number';
-our $VERSION = '0.02';
+our $VERSION = '0.65';
our $AUTHORITY = 'cpan:STEVAN';
use base 'Class::MOP::Method::Generated';
|| confess "You must pass a metaclass instance if you want to inline"
if $options{is_inline};
+ ($options{package_name} && $options{name})
+ || confess "You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT";
+
my $self = bless {
# from our superclass
- '&!body' => undef,
+ '&!body' => undef,
+ '$!package_name' => $options{package_name},
+ '$!name' => $options{name},
# specific to this subclass
'%!options' => $options{options} || {},
'$!associated_metaclass' => $options{metaclass},
}
sub generate_constructor_method {
- return sub { (shift)->meta->new_object(@_) }
+ return sub { Class::MOP::Class->initialize(shift)->new_object(@_) }
}
sub generate_constructor_method_inline {
my $source = 'sub {';
$source .= "\n" . 'my ($class, %params) = @_;';
- $source .= "\n" . 'return $class->meta->new_object(%params)';
+ $source .= "\n" . 'return Class::MOP::Class->initialize($class)->new_object(%params)';
$source .= "\n" . ' if $class ne \'' . $self->associated_metaclass->name . '\';';
$source .= "\n" . 'my $instance = ' . $self->meta_instance->inline_create_instance('$class');
$default = '$instance->'.$attr->builder;
}
- 'if(exists $params{\'' . $attr->init_arg . '\'}){' . "\n" .
- $self->meta_instance->inline_set_slot_value(
- '$instance',
- ("'" . $attr->name . "'"),
- '$params{\'' . $attr->init_arg . '\'}' ) . "\n" .
- '} ' . (!defined $default ? '' : 'else {' . "\n" .
- $self->meta_instance->inline_set_slot_value(
- '$instance',
- ("'" . $attr->name . "'"),
- $default ) . "\n" .
- '}');
+ if ( defined $attr->init_arg ) {
+ return (
+ 'if(exists $params{\'' . $attr->init_arg . '\'}){' . "\n" .
+ $self->meta_instance->inline_set_slot_value(
+ '$instance',
+ ("'" . $attr->name . "'"),
+ '$params{\'' . $attr->init_arg . '\'}' ) . "\n" .
+ '} ' . (!defined $default ? '' : 'else {' . "\n" .
+ $self->meta_instance->inline_set_slot_value(
+ '$instance',
+ ("'" . $attr->name . "'"),
+ $default ) . "\n" .
+ '}')
+ );
+ } elsif ( defined $default ) {
+ return (
+ $self->meta_instance->inline_set_slot_value(
+ '$instance',
+ ("'" . $attr->name . "'"),
+ $default ) . "\n"
+ );
+ } else { return '' }
}
1;
-1;
-
__END__
=pod
=head1 DESCRIPTION
This is a subclass of C<Class::MOP::Method> which deals with
-class constructors.
+class constructors. This is used when making a class immutable
+to generate an optimized constructor.
=head1 METHODS
=back
-=head2 Method Generators
+=head2 Method Generators
=over 4
=head1 COPYRIGHT AND LICENSE
-Copyright 2006, 2007 by Infinity Interactive, Inc.
+Copyright 2006-2008 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>