[Catalyst-commits] r7903 -
Catalyst-Runtime/5.80/branches/moose/lib/Catalyst
groditi at dev.catalyst.perl.org
groditi at dev.catalyst.perl.org
Mon Jun 9 19:46:29 BST 2008
Author: groditi
Date: 2008-06-09 19:46:29 +0100 (Mon, 09 Jun 2008)
New Revision: 7903
Modified:
Catalyst-Runtime/5.80/branches/moose/lib/Catalyst/ClassData.pm
Log:
broken classdata version
Modified: Catalyst-Runtime/5.80/branches/moose/lib/Catalyst/ClassData.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/moose/lib/Catalyst/ClassData.pm 2008-06-09 18:17:10 UTC (rev 7902)
+++ Catalyst-Runtime/5.80/branches/moose/lib/Catalyst/ClassData.pm 2008-06-09 18:46:29 UTC (rev 7903)
@@ -4,26 +4,51 @@
use Scalar::Util 'blessed';
sub mk_classdata {
- my ($declaredclass, $attribute, $data) = @_;
+ my ($class, $attribute) = @_;
confess("mk_classdata() is a class method, not an object method")
- if ref $declaredclass;
+ if blessed $class;
- my $accessor = sub {
- my $wantclass = blessed($_[0]) || $_[0];
-
- return $wantclass->mk_classdata($attribute)->(@_)
- if @_>1 && $wantclass ne $declaredclass;
-
- $data = $_[1] if @_>1;
- return $data;
+ my $slot = '$'.$attribute;
+ my $accessor = sub {
+ if(@_ > 1){
+ $_[0]->meta->add_package_symbol($slot, \ $_[1]);
+ return $_[1];
+ }
+ foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) {
+ my $meta = $super->meta;
+ if( $meta->has_package_symbol($slot) ){
+ return $meta->get_package_symbol($slot);
+ }
+ }
+ return;
};
+ my $accessor = eval $code;
+ confess("Failed to create accessor: $@ \n $code \n")
+ unless ref $accessor eq 'CODE';
+ my $meta = $class->meta;
my $alias = "_${attribute}_accessor";
- $declaredclass->meta->add_method($alias, $accessor);
- $declaredclass->meta->add_method($attribute, $accessor);
+ $meta->add_method($alias, $accessor);
+ $meta->add_method($attribute, $accessor);
+ $class->$attribute($_[2]) if(@_ > 2);
return $accessor;
}
1;
__END__
+
+# my $code = ' sub {
+# if(@_ > 1){
+# $_[0]->meta->add_package_symbol(\''.$slot.'\', \ $_[1]);
+# return $_[1];
+# }
+# foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) {
+# my $meta = $super->meta;
+# if( $meta->has_package_symbol(\''.$slot.'\') ){
+# return $meta->get_package_symbol(\''.$slot.'\');
+# }
+# }
+# return;
+# }';
+# my $accessor = eval $code;
More information about the Catalyst-commits
mailing list