diff options
author | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-03-11 04:37:14 +0000 |
---|---|---|
committer | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-03-11 04:37:14 +0000 |
commit | 841351770e59124bf86902c07d9534383a57a991 (patch) | |
tree | d0c82c97067b54d8942a37e1191de8ccfbdc056d /lib/Reaction/InterfaceModel | |
parent | 881dd5577887267d76437631ccd0f456d56f9d99 (diff) | |
download | reaction-841351770e59124bf86902c07d9534383a57a991.tar.gz reaction-841351770e59124bf86902c07d9534383a57a991.zip |
I have no idea what the reflector changes in the last commit were supposed to be, but they didn't work
Diffstat (limited to 'lib/Reaction/InterfaceModel')
-rw-r--r-- | lib/Reaction/InterfaceModel/Reflector/DBIC.pm | 131 |
1 files changed, 125 insertions, 6 deletions
diff --git a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm index 62f93a0..2c34cdf 100644 --- a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm +++ b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm @@ -17,15 +17,134 @@ class DBIC, which { has make_classes_immutable => (isa => "Bool", is => "rw", required => 1, default => sub{ 1 }); - implements create_classes => as { + #user defined actions and prototypes + has object_actions => (isa => "HashRef", is => "rw", lazy_build => 1); + has collection_actions => (isa => "HashRef", is => "rw", lazy_build => 1); + + #which actions to create by default + has default_object_actions => (isa => "ArrayRef", is => "rw", lazy_build => 1); + has default_collection_actions => (isa => "ArrayRef", is => "rw", lazy_build => 1); + + #builtin actions and prototypes + has builtin_object_actions => (isa => "HashRef", is => "rw", lazy_build => 1); + has builtin_collection_actions => (isa => "HashRef", is => "rw", lazy_build => 1); + + implements _build_object_actions => as { {} }; + implements _build_collection_actions => as { {} }; + + implements _build_default_object_actions => as { [ qw/Update Delete/ ] }; + implements _build_default_collection_actions => as { [ qw/Create DeleteAll/ ] }; + + implements _build_builtin_object_actions => as { + { + Update => { name => 'Update', base => Update }, + Delete => { name => 'Delete', base => Delete, attributes => [] }, + }; + }; + + implements _build_builtin_collection_actions => as { + { + Create => {name => 'Create', base => Create }, + DeleteAll => {name => 'DeleteAll', base => DeleteAll, attributes => [] } + }; + }; + + implements _all_object_actions => as { + my $self = shift; + return $self->merge_hashes + ($self->builtin_object_actions, $self->object_actions); + }; + + implements _all_collection_actions => as { my $self = shift; - my $packages = $self->packages; + return $self->merge_hashes + ($self->builtin_collection_actions, $self->collection_actions); + }; + + implements dm_name_from_class_name => as { + my($self, $class) = @_; + confess("wrong arguments") unless $class; + $class =~ s/::/_/g; + $class = "_" . lc($class) . "_store"; + return $class; + }; + + implements dm_name_from_source_name => as { + my($self, $source) = @_; + confess("wrong arguments") unless $source; + $source =~ s/([a-z0-9])([A-Z])/${1}_${2}/g ; + $source = "_" . lc($source) . "_store"; + return $source; + }; - while(my($name, $properties) = each %$packages){ - my $base = $properties->{base} || 'Reaction::Object'; - my $meta = $self->_load_or_create($name, $base); + implements class_name_from_source_name => as { + my ($self, $model_class, $source_name) = @_; + confess("wrong arguments") unless $model_class && $source_name; + return join "::", $model_class, $source_name; + }; + + implements class_name_for_collection_of => as { + my ($self, $object_class) = @_; + confess("wrong arguments") unless $object_class; + return "${object_class}::Collection"; + }; + + implements merge_hashes => as { + my($self, $left, $right) = @_; + return Catalyst::Utils::merge_hashes($left, $right); + }; + + implements parse_reflect_rules => as { + my ($self, $rules, $haystack) = @_; + confess('$rules must be an array reference') unless ref $rules eq 'ARRAY'; + confess('$haystack must be an array reference') unless ref $haystack eq 'ARRAY'; + + my $needles = {}; + my (@exclude, @include, $global_opts); + if(@$rules == 2 && $rules->[0] eq '-exclude'){ + push(@exclude, (ref $rules->[1] eq 'ARRAY' ? @{$rules->[1]} : $rules->[1])); + } else { + for my $rule ( @$rules ){ + if (ref $rule eq 'ARRAY' && $rule->[0] eq '-exclude'){ + push(@exclude, (ref $rule->[1] eq 'ARRAY' ? @{$rule->[1]} : $rule->[1])); + } elsif( ref $rule eq 'HASH' ){ + $global_opts = ref $global_opts eq 'HASH' ? + $self->merge_hashes($global_opts, $rule) : $rule; + } else { + push(@include, $rule); + } + } } + my $check_exclude = sub{ + for my $rule (@exclude){ + return 1 if(ref $rule eq 'Regexp' ? $_[0] =~ /$rule/ : $_[0] eq $rule); + } + return; + }; + @$haystack = grep { !$check_exclude->($_) } @$haystack; + $self->merge_reflect_rules(\@include, $needles, $haystack, $global_opts); + return $needles; + }; + + implements merge_reflect_rules => as { + my ($self, $rules, $needles, $haystack, $local_opts) = @_; + for my $rule ( @$rules ){ + if(!ref $rule && ( grep {$rule eq $_} @$haystack ) ){ + $needles->{$rule} = defined $needles->{$rule} ? + $self->merge_hashes($needles->{$rule}, $local_opts) : $local_opts; + } elsif( ref $rule eq 'Regexp' ){ + for my $match ( grep { /$rule/ } @$haystack ){ + $needles->{$match} = defined $needles->{$match} ? + $self->merge_hashes($needles->{$match}, $local_opts) : $local_opts; + } + } elsif( ref $rule eq 'ARRAY' ){ + my $opts; + $opts = pop(@$rule) if @$rule > 1 and ref $rule->[$#$rule] eq 'HASH'; + $opts = $self->merge_hashes($local_opts, $opts) if defined $local_opts; + $self->merge_reflect_rules($rule, $needles, $haystack, $opts); + } + } }; implements reflect_schema => as { @@ -42,7 +161,7 @@ class DBIC, which { unless($model && $schema); Class::MOP::load_class( $base ); Class::MOP::load_class( $schema ); - + my $meta = $self->_load_or_create($model, $base); # sources => undef, #default to qr/./ # sources => [], #default to nothing |