[Dbix-class] Enforcing read-only objects

Ian Docherty (icydee) dbix-class at iandocherty.com
Thu Aug 12 18:44:53 GMT 2010


On 12/08/2010 15:34, Ronald J Kimball wrote:
> On Wed, Aug 11, 2010 at 6:09 PM, Ian Docherty (icydee)
> <dbix-class at iandocherty.com>  wrote:
>
>> Ignoring for the moment the artists, cds, tracks etc. I could see it
>> something like the following. (top of my head, first impressions, probably
>> totally borked)
>>
>> In your application code.
>> ----
>>
>> my $factory = MyApp::Business->new({schema =>  $schema});
>> my $label   = $factory->find_label($id);
>>
>> $label->set_active;
>>
>> ----
>> The factory code might have something like the following
>> ----
>> package MyApp::Business;
>> use Moose;
>>
>> has 'schema' =>  (is =>  'ro', required =>  1);
>>
>> sub find_label {
>>     my ($self, $id) = @_;
>>
>>     return $self->schema->resultset('DB::Label')->find($id);
>> }
>> ----
>> Your Label class would be something like.
>> ----
>> package MyApp::Business::Label;
>> use Moose;
>>
>> has 'dbic_obj' =>  (is =>  'ro', required =>  1);
>>
>> sub set_active {
>>     my ($self) = @_;
>>
>>     die "Is Readonly" if $self->dbic_obj->is_readonly;
>>
>>     $self->dbic_obj->active( 1 );
>>     $self->dbic_obj->update;
>> }
>
>> Note. The above code is totally untested and likely to be broken and is only
>> an indication of the general method! Please don't flame me for syntax errors
>> but feel free to suggest alternative ways of doing this. I am still learning
>> too!
>
> Please don't consider this a flame.  :)  I just wanted to point out
> that your find_label() method is returning a DBIC row object, but I
> presume you intended for it to return a MyApp::Business::Label object.
>   I believe that would look something like this:
>
> sub find_label {
>     my ($self, $id) = @_;
>
>     return MyApp::Business::Label->new(
>       dbic_obj =>  $self->schema->resultset('DB::Label')->find($id)
>     );
> }
>
> (Also untested, etc.)
>
;) no not a flame, thanks for pointing it out. Although I think I would 
probably write using a hash-ref

sub find_label {
     my ($self, $id) = @_;

     return MyApp::Business::Label->new({
       dbic_obj =>  $self->schema->resultset('DB::Label')->find($id)
     });
}


Regards
Ian



More information about the DBIx-Class mailing list