diff options
author | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-08-23 01:55:59 +0000 |
---|---|---|
committer | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-08-23 01:55:59 +0000 |
commit | 27f4dfaad9a05840c85b3a78c79274b207d91cda (patch) | |
tree | 98cbf486bc97d47a9515a7dd955ff37b8c65ea04 | |
parent | b343a98334a380a174a63d040f2a1c92d68e2167 (diff) | |
download | reaction-27f4dfaad9a05840c85b3a78c79274b207d91cda.tar.gz reaction-27f4dfaad9a05840c85b3a78c79274b207d91cda.zip |
roles support for all classes created by the reflector. this should make the reflector much more versatile and reusing basic action components a lot easier
-rw-r--r-- | lib/Reaction/InterfaceModel/Reflector/DBIC.pm | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm index 4d14edd..20cb424 100644 --- a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm +++ b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm @@ -137,6 +137,7 @@ sub merge_reflect_rules { sub reflect_schema { my ($self, %opts) = @_; my $base = delete $opts{base} || Object; + my $roles = delete $opts{roles} || []; my $model = delete $opts{model_class}; my $schema = delete $opts{schema_class}; my $dm_name = delete $opts{domain_model_name}; @@ -148,8 +149,12 @@ sub reflect_schema { unless($model && $schema); Class::MOP::load_class( $base ); Class::MOP::load_class( $schema ); - my $meta = $self->_load_or_create($model, $base); - + my $meta = $self->_load_or_create( + $model, + superclasses => [$base], + ( @$roles ? (roles => $roles) : ()), + ); + # sources => undef, #default to qr/./ # sources => [], #default to nothing # sources => qr//, #DWIM, treated as [qr//] @@ -157,7 +162,7 @@ sub reflect_schema { # sources => [[-exclude => ...]] #DWIM, treat as [qr/./, [-exclude => ...]] my $haystack = [ $schema->sources ]; - my $rules = delete $opts{sources}; + my $rules = delete $opts{sources}; if(!defined $rules){ $rules = [qr/./]; } elsif( ref $rules eq 'Regexp'){ @@ -354,6 +359,7 @@ sub reflect_source { sub reflect_source_collection { my ($self, %opts) = @_; my $base = delete $opts{base} || ResultSet; + my $roles = delete $opts{roles} || []; my $class = delete $opts{class}; my $object = delete $opts{object_class}; my $source = delete $opts{source_class}; @@ -365,7 +371,12 @@ sub reflect_source_collection { Class::MOP::load_class( $base ); Class::MOP::load_class( $object ); - my $meta = $self->_load_or_create($class, $base); + + my $meta = $self->_load_or_create( + $class, + superclasses => [$base], + ( @$roles ? (roles => $roles) : ()), + ); my $make_immutable = $meta->is_immutable || $self->make_classes_immutable;; $meta->make_mutable if $meta->is_immutable; @@ -431,10 +442,11 @@ sub reflect_source_object { my($self, %opts) = @_; %opts = %{ $self->merge_hashes(\%opts, $self->_compute_source_options(%opts)) }; - my $base = delete $opts{base} || Object; - my $class = delete $opts{class}; - my $dm_name = delete $opts{domain_model_name}; - my $dm_opts = delete $opts{domain_model_args} || {}; + my $base = delete $opts{base} || Object; + my $roles = delete $opts{roles} || []; + my $class = delete $opts{class}; + my $dm_name = delete $opts{domain_model_name}; + my $dm_opts = delete $opts{domain_model_args} || {}; my $source_name = delete $opts{source_name}; my $schema = delete $opts{schema_class}; @@ -451,7 +463,11 @@ sub reflect_source_object { Class::MOP::load_class($schema) if $schema; Class::MOP::load_class($source_class); - my $meta = $self->_load_or_create($class, $base); + my $meta = $self->_load_or_create( + $class, + superclasses => [$base], + ( @$roles ? (roles => $roles) : ()), + ); #create the domain model $dm_name ||= $self->dm_name_from_source_name($source_name); @@ -720,9 +736,10 @@ sub parameters_for_source_object_attribute { }; sub reflect_source_action { my($self, %opts) = @_; - my $name = delete $opts{name}; - my $class = delete $opts{class}; - my $base = delete $opts{base} || Action; + my $name = delete $opts{name}; + my $base = delete $opts{base} || Action; + my $roles = delete $opts{roles} || []; + my $class = delete $opts{class}; my $object = delete $opts{object_class}; my $source = delete $opts{source_class}; @@ -763,7 +780,11 @@ sub reflect_source_action { my $attributes = $self->parse_reflect_rules($attr_rules, $attr_haystack); #create the class - my $meta = $self->_load_or_create($class, $base); + my $meta = $self->_load_or_create( + $class, + superclasses => [$base], + ( @$roles ? (roles => $roles) : ()), + ); my $make_immutable = $meta->is_immutable || $self->make_classes_immutable; $meta->make_mutable if $meta->is_immutable; @@ -870,12 +891,22 @@ sub parameters_for_source_object_action_attribute { #print STDERR Dumper(\%attr_opts); return \%attr_opts; }; + sub _load_or_create { - my ($self, $class, $base) = @_; - my $meta = $self->_maybe_load_class($class) ? - $class->meta : $base->meta->create($class, superclasses => [ $base ]); - return $meta; -}; + my ($self, $class, %options) = @_; + + if( $self->_maybe_load_class($class) ){ + return $class->meta; + } + my $base; + if( exists $options{superclasses} ){ + ($base) = @{ $options{superclasses} }; + } else { + $base = 'Reaction::InterfaceModel::Action'; + } + return $base->meta->create($class, %options); +} + sub _maybe_load_class { my ($self, $class) = @_; my $file = $class . '.pm'; @@ -885,7 +916,7 @@ sub _maybe_load_class { confess "Error loading ${class}: $@"; } return $ret; -}; +} __PACKAGE__->meta->make_immutable; |