Commit | Line | Data |
a7caa492 |
1 | package Catalyst::ClassData; |
2 | |
3 | use Moose::Role; |
4 | use Scalar::Util 'blessed'; |
5 | |
6 | sub mk_classdata { |
efbfd430 |
7 | my ($class, $attribute) = @_; |
a7caa492 |
8 | confess("mk_classdata() is a class method, not an object method") |
efbfd430 |
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; |
a7caa492 |
24 | }; |
efbfd430 |
25 | my $accessor = eval $code; |
26 | confess("Failed to create accessor: $@ \n $code \n") |
27 | unless ref $accessor eq 'CODE'; |
a7caa492 |
28 | |
efbfd430 |
29 | my $meta = $class->meta; |
a7caa492 |
30 | my $alias = "_${attribute}_accessor"; |
efbfd430 |
31 | $meta->add_method($alias, $accessor); |
32 | $meta->add_method($attribute, $accessor); |
33 | $class->$attribute($_[2]) if(@_ > 2); |
a7caa492 |
34 | return $accessor; |
35 | } |
36 | |
37 | 1; |
38 | |
39 | __END__ |
efbfd430 |
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; |