X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FInterfaceModel%2FReflector%2FDBIC.pm;h=230683ad65db4d802e39672bb8015c27bd0e0632;hb=7fdf5e932b12471adba977ef9c627c204807a64f;hp=20cb4248b5ca309a5cf49b5361a2058f7423461b;hpb=27f4dfaad9a05840c85b3a78c79274b207d91cda;p=catagits%2FReaction.git diff --git a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm index 20cb424..230683a 100644 --- a/lib/Reaction/InterfaceModel/Reflector/DBIC.pm +++ b/lib/Reaction/InterfaceModel/Reflector/DBIC.pm @@ -15,7 +15,6 @@ use Catalyst::Utils; use namespace::clean -except => [ qw(meta) ]; - has make_classes_immutable => (isa => "Bool", is => "rw", required => 1, default => sub{ 1 }); #user defined actions and prototypes @@ -210,33 +209,18 @@ sub _compute_source_options { OUTER: until( $schema && $source_name && $source_class && $parent_dm ){ if( $schema && !$source_name){ - next OUTER if $source_name = $source_class->result_source_instance->source_name; + next OUTER if $source_name = $schema->source($source_class)->source_name; } elsif( $schema && !$source_class){ next OUTER if $source_class = eval { $schema->class($source_name) }; } - if($source_class && (!$schema || !$source_name)){ - if(!$schema){ - $schema = $source_class->result_source_instance->schema; - next OUTER if $schema && Class::MOP::load_class($schema); - } - if(!$source_name){ - $source_name = $source_class->result_source_instance->source_name; - next OUTER if $source_name; - } - } - my @haystack = $parent_dm ? - $parent->meta->find_attribute_by_name($parent_dm) : $parent->domain_models; + my @haystack = $parent_dm ? $parent->meta->find_attribute_by_name($parent_dm) : (); #there's a lot of guessing going on, but it should work fine on most cases INNER: for my $needle (@haystack){ my $isa = $needle->_isa_metadata; next INNER unless Class::MOP::load_class( $isa->_isa_metadata ); next INNER unless $isa->isa('DBIx::Class::Schema'); - if(!$parent_dm && $schema && $isa eq $schema){ - $parent_dm = $needle->name; - next OUTER; - } if( $source_name ){ my $src_class = eval{ $isa->class($source_name) }; @@ -249,11 +233,6 @@ OUTER: until( $schema && $source_name && $source_class && $parent_dm ){ } } - #do we even need to go this far? - if( !$parent_dm && $schema ){ - my $tentative = $self->dm_name_from_class_name($schema); - $parent_dm = $tentative if grep{$_->name eq $tentative} @haystack; - } confess("Could not determine options automatically from: schema " . "'${schema}', source_name '${source_name}', source_class " . @@ -346,6 +325,7 @@ sub reflect_source { ( object_class => $obj_meta->name, source_class => $opts{source_class}, + schema => $opts{schema_class}, %$collection ); @@ -364,6 +344,7 @@ sub reflect_source_collection { my $object = delete $opts{object_class}; my $source = delete $opts{source_class}; my $action_rules = delete $opts{actions}; + my $schema = delete $opts{schema}; confess('object_class and source_class are required parameters') unless $object && $source; @@ -418,6 +399,7 @@ sub reflect_source_collection { #hash key as the name. I think this is sane beahvior, but I've actually been thinking #of making Action prototypes their own separate objects $self->reflect_source_action( + schema => $schema, name => $action, object_class => $object, source_class => $source, @@ -537,6 +519,7 @@ sub reflect_source_object { my $attributes = $self->parse_reflect_rules($attr_rules, $attr_haystack); for my $attr_name (keys %$attributes){ $self->reflect_source_object_attribute( + schema => $schema, class => $class, source_class => $source_class, parent_class => $parent, @@ -575,6 +558,7 @@ sub reflect_source_object { #hash key as the name. I think this is sane beahvior, but I've actually been thinking #of making Action prototypes their own separate objects $self->reflect_source_action( + schema => $schema, name => $action, object_class => $class, source_class => $source_class, @@ -628,28 +612,16 @@ sub parameters_for_source_object_attribute { my $dm_name = delete $opts{domain_model_name}; my $source_class = delete $opts{source_class}; my $parent_class = delete $opts{parent_class}; + my $schema = $opts{schema}; confess("parent_class is a required argument") unless $parent_class; confess("You must supply at least one of domain_model_name and source_class") unless $dm_name || $source_class; - my $source; - $source = $source_class->result_source_instance if $source_class; - #puke! dwimery - if( !$source_class ){ - my $dm = $class->meta->find_attribute_by_name($dm_name); - $source_class = $dm->_isa_metadata; - $source = $source_class->result_source_instance; - } elsif( !$dm_name ){ - ($dm_name) = map{$_->name} grep{$_->_isa_metadata eq $source_class} - $class->meta->domain_models; - if( !$dm_name ){ #last resort guess - my $tentative = $self->dm_name_from_source_name($source->source_name); - ($dm_name) = $tentative if grep{$_->name eq $tentative} $class->domain_models; - } - } - + my $source = $schema->source($source_class); my $from_attr = $source_class->meta->find_attribute_by_name($attr_name); my $reader = $from_attr->get_read_method; + die("Could not find reader for attribute '$attr_name' on $source_class") + unless $reader; #default options. lazy build but no outsider method my %attr_opts = ( is => 'ro', lazy => 1, required => 1, @@ -661,6 +633,7 @@ sub parameters_for_source_object_attribute { domain_model => $dm_name, orig_attr_name => $attr_name, ); + $attr_opts{coerce} = 1 if $from_attr->should_coerce; #m2m / has_many my $m2m_meta; @@ -674,7 +647,7 @@ sub parameters_for_source_object_attribute { if( my $rel_info = $source->relationship_info($attr_name) ){ my $rel_accessor = $rel_info->{attrs}->{accessor}; - my $rel_moniker = $rel_info->{class}->result_source_instance->source_name; + my $rel_moniker = $schema->source($rel_info->{class})->source_name; if($rel_accessor eq 'multi' && $constraint_is_ArrayRef) { #has_many @@ -730,7 +703,9 @@ sub parameters_for_source_object_attribute { } else { #no rel $attr_opts{isa} = $from_attr->_isa_metadata; - $attr_opts{default} = eval "sub{ shift->${dm_name}->${reader} }"; + my $default_code = "sub{ shift->${dm_name}->${reader} }"; + $attr_opts{default} = eval $default_code; + die "Could not generate default for attribute, code '$default_code' did not compile with: $@" if $@; } return \%attr_opts; }; @@ -742,6 +717,7 @@ sub reflect_source_action { my $class = delete $opts{class}; my $object = delete $opts{object_class}; my $source = delete $opts{source_class}; + my $schema = delete $opts{schema}; confess("name, object_class and source_class are required arguments") unless $source && $name && $object; @@ -777,7 +753,7 @@ sub reflect_source_action { my $o_meta = $object->meta; my $s_meta = $source->meta; - my $attributes = $self->parse_reflect_rules($attr_rules, $attr_haystack); + my $attributes = $self->parse_reflect_rules($attr_rules, $attr_haystack); #create the class my $meta = $self->_load_or_create( @@ -800,6 +776,7 @@ sub reflect_source_action { my $attr_params = $self->parameters_for_source_object_action_attribute ( + schema => $schema, object_class => $object, source_class => $source, attribute_name => $attr_name @@ -816,6 +793,8 @@ sub parameters_for_source_object_action_attribute { my $object = delete $opts{object_class}; my $attr_name = delete $opts{attribute_name}; my $source_class = delete $opts{source_class}; + my $schema = delete $opts{schema}; + my $source = $schema->source($source_class); confess("object_class and attribute_name are required parameters") unless $attr_name && $object; @@ -857,7 +836,6 @@ sub parameters_for_source_object_action_attribute { $from_attr->type_constraint->name eq 'ArrayRef' || $from_attr->type_constraint->is_subtype_of('ArrayRef'); - my $source = $source_class->result_source_instance; if (my $rel_info = $source->relationship_info($attr_name)) { my $rel_accessor = $rel_info->{attrs}->{accessor};