still failing some tests. waiting for suggestions on whether to fix old CDIretardedness
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ClassData.pm
1 package Catalyst::ClassData;
2
3 use Moose::Role;
4 use Class::MOP;
5 use Scalar::Util 'blessed';
6
7 sub mk_classdata {
8   my ($class, $attribute) = @_;
9   confess("mk_classdata() is a class method, not an object method")
10     if blessed $class;
11
12   my $slot = '$'.$attribute;
13   my $accessor =  sub {
14     if(@_ > 1){
15       $_[0]->meta->add_package_symbol($slot, \ $_[1]);
16       return $_[1];
17     }
18
19     foreach my $super ( (blessed $_[0] || $_[0]), $_[0]->meta->linearized_isa ) {
20       my $meta = Moose::Meta::Class->initialize($super);
21       if( $meta->has_package_symbol($slot) ){
22         return ${ $meta->get_package_symbol($slot) };
23       }
24     }
25     return;
26   };
27
28   confess("Failed to create accessor: $@ ")
29     unless ref $accessor eq 'CODE';
30
31   my $meta = $class->meta;
32   my $alias = "_${attribute}_accessor";
33   $meta->add_method($alias, $accessor);
34   $meta->add_method($attribute, $accessor);
35   $class->$attribute($_[2]) if(@_ > 2);
36   return $accessor;
37 }
38
39 1;
40
41 __END__