broken classdata version
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ClassData.pm
1 package Catalyst::ClassData;
2
3 use Moose::Role;
4 use Scalar::Util 'blessed';
5
6 sub mk_classdata {
7   my ($class, $attribute) = @_;
8   confess("mk_classdata() is a class method, not an object method")
9     if blessed $class;
10
11   my $slot = '$'.$attribute;
12   my $accessor =  sub {
13     if(@_ > 1){
14       $_[0]->meta->add_package_symbol($slot, \  $_[1]);
15       return $_[1];
16     }
17     foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) {
18       my $meta = $super->meta;
19       if( $meta->has_package_symbol($slot) ){
20         return $meta->get_package_symbol($slot);
21       }
22     }
23     return;
24   };
25   my $accessor = eval $code;
26   confess("Failed to create accessor: $@ \n $code \n")
27     unless ref $accessor eq 'CODE';
28
29   my $meta = $class->meta;
30   my $alias = "_${attribute}_accessor";
31   $meta->add_method($alias, $accessor);
32   $meta->add_method($attribute, $accessor);
33   $class->$attribute($_[2]) if(@_ > 2);
34   return $accessor;
35 }
36
37 1;
38
39 __END__
40
41 #   my $code = ' sub {
42 #     if(@_ > 1){
43 #       $_[0]->meta->add_package_symbol(\''.$slot.'\', \  $_[1]);
44 #       return $_[1];
45 #     }
46 #     foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) {
47 #       my $meta = $super->meta;
48 #       if( $meta->has_package_symbol(\''.$slot.'\') ){
49 #         return $meta->get_package_symbol(\''.$slot.'\');
50 #       }
51 #     }
52 #     return;
53 #   }';
54 #   my $accessor = eval $code;