X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FMethod.pm;h=9a0cdda61592d3e19f6d5d485cf12b01fa310521;hb=19042e4de51060275cd940cf997a6791afb0dfec;hp=072778d03ecfccec1878f80f8b94ee21d8cc0be5;hpb=403cfbeccca4e7750da88c52ad7fd81f35a7e9a7;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Method.pm b/lib/Class/MOP/Method.pm index 072778d..9a0cdda 100644 --- a/lib/Class/MOP/Method.pm +++ b/lib/Class/MOP/Method.pm @@ -5,9 +5,9 @@ use strict; use warnings; use Carp 'confess'; -use Scalar::Util 'weaken'; +use Scalar::Util 'weaken', 'reftype', 'blessed'; -our $VERSION = '0.82'; +our $VERSION = '0.92'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -18,15 +18,6 @@ use base 'Class::MOP::Object'; # they should act like CODE refs. use overload '&{}' => sub { $_[0]->body }, fallback => 1; -our $UPGRADE_ERROR_TEXT = q{ ---------------------------------------------------------- -NOTE: this error is likely not an error, but a regression -caused by the latest upgrade to Moose/Class::MOP. Consider -upgrading any MooseX::* modules to their latest versions -before spending too much time chasing this one down. ---------------------------------------------------------- -}; - # construction sub wrap { @@ -37,11 +28,18 @@ sub wrap { my %params = @args; my $code = $params{body}; - ('CODE' eq ref($code)) - || confess "You must supply a CODE reference to bless, not (" . ($code || 'undef') . ")"; + if (blessed($code) && $code->isa(__PACKAGE__)) { + my $method = $code->clone; + delete $params{body}; + Class::MOP::class_of($class)->rebless_instance($method, %params); + return $method; + } + elsif (!ref $code || 'CODE' ne reftype($code)) { + confess "You must supply a CODE reference to bless, not (" . ($code || 'undef') . ")"; + } ($params{package_name} && $params{name}) - || confess "You must supply the package_name and name parameters $UPGRADE_ERROR_TEXT"; + || confess "You must supply the package_name and name parameters"; my $self = $class->_new(\%params); @@ -52,13 +50,18 @@ sub wrap { sub _new { my $class = shift; + + return Class::MOP::Class->initialize($class)->new_object(@_) + if $class ne __PACKAGE__; + my $params = @_ == 1 ? $_[0] : {@_}; - my $self = bless { + return bless { 'body' => $params->{body}, 'associated_metaclass' => $params->{associated_metaclass}, 'package_name' => $params->{package_name}, 'name' => $params->{name}, + 'original_method' => $params->{original_method}, } => $class; } @@ -148,8 +151,9 @@ introspection interface. =item B<< Class::MOP::Method->wrap($code, %options) >> -This is the constructor. It accepts a subroutine reference and a hash -of options. +This is the constructor. It accepts a method body in the form of +either a code reference or a L instance, followed +by a hash of options. The options are: @@ -157,11 +161,13 @@ The options are: =item * name -The method name (without a package name). This is required. +The method name (without a package name). This is required if C<$code> +is a coderef. =item * package_name -The package name for the method. This is required. +The package name for the method. This is required if C<$code> is a +coderef. =item * associated_metaclass